pax_global_header00006660000000000000000000000064152655026630014524gustar00rootroot0000000000000052 comment=222f0e738bbbec2a75a7634df73ea18c594671ea pytactl-3.2/000077500000000000000000000000001526550266300130505ustar00rootroot00000000000000pytactl-3.2/.github/000077500000000000000000000000001526550266300144105ustar00rootroot00000000000000pytactl-3.2/.github/workflows/000077500000000000000000000000001526550266300164455ustar00rootroot00000000000000pytactl-3.2/.github/workflows/lint.yml000066400000000000000000000013661526550266300201440ustar00rootroot00000000000000name: Lint on: [push, pull_request] permissions: contents: read jobs: lint: runs-on: ubuntu-latest strategy: matrix: python-version: ["3.10", "3.11"] steps: - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 with: persist-credentials: false - name: Set up Python ${{ matrix.python-version }} uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0 with: python-version: ${{ matrix.python-version }} - name: Install dependencies run: | python -m pip install --upgrade pip pip install ruff==0.15.17 # pin ruff version for consistent results - name: Analysing the code with ruff run: | make lint pytactl-3.2/.github/workflows/publish.yml000066400000000000000000000044301526550266300206370ustar00rootroot00000000000000# Copyright (c) 2026 Qualcomm Technologies, Inc. and/or its subsidiaries. # SPDX-License-Identifier: BSD-3-Clause name: Publish to PyPI on: release: types: [published] workflow_dispatch: permissions: {} jobs: build: name: Build distributions runs-on: ubuntu-latest permissions: contents: read steps: - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 with: persist-credentials: false - name: Set up Python uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0 with: python-version: "3.11" - name: Install build tooling run: | python -m pip install --upgrade pip pip install build twine - name: Check the version matches the tag if: github.ref_type == 'tag' env: TAG: ${{ github.ref_name }} run: | VERSION=$(python -c 'import ast, sys; t = ast.parse(open("pytactl/__init__.py").read()); print(next(n.value.value for n in t.body if isinstance(n, ast.Assign) and n.targets[0].id == "__version__"))') if [ "${TAG#v}" != "$VERSION" ] && [ "${TAG#v}.0" != "$VERSION" ]; then echo "::error::Tag $TAG does not match pytactl.__version__ $VERSION; bump the version before tagging." exit 1 fi - name: Build sdist and wheel run: python -m build - name: Check distributions run: twine check --strict dist/* - name: Upload distributions uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2 with: name: dist path: dist/ publish: name: Publish to PyPI needs: build runs-on: ubuntu-latest # Uses PyPI Trusted Publishing (OIDC); no API token secret is required. # Configure the publisher for this repository and workflow at # https://pypi.org/manage/project/pytactl/settings/publishing/ environment: name: pypi url: https://pypi.org/p/pytactl permissions: id-token: write contents: read steps: - name: Download distributions uses: actions/download-artifact@9000827ccba6bdab643e8b6fd33ac0654aef8333 # v8.0.2 with: name: dist path: dist/ - name: Publish uses: pypa/gh-action-pypi-publish@dc37677b2e1c63e2034f94d8a5b11f265b73ba33 # v1.14.2 pytactl-3.2/.github/workflows/qcom-preflight-checks.yml000066400000000000000000000012071526550266300233470ustar00rootroot00000000000000name: QC Preflight Checks on: pull_request: push: branches: [main] workflow_dispatch: jobs: preflight: name: Run QC Preflight Checks uses: qualcomm/qcom-reusable-workflows/.github/workflows/reusable-qcom-preflight-checks-orchestrator.yml@940a2b8f218dd8fea38cec2ec34776d98f039f69 # v2.0.14 with: enable-semgrep-scan: true enable-dependency-review: true enable-repolinter-check: true enable-copyright-license-check: true enable-commit-email-check: true enable-commit-msg-check: false enable-armor-checkers: false permissions: contents: read security-events: write pytactl-3.2/.github/workflows/release.yml000066400000000000000000000035331526550266300206140ustar00rootroot00000000000000# Copyright (c) 2026 Qualcomm Technologies, Inc. and/or its subsidiaries. # SPDX-License-Identifier: BSD-3-Clause # Creates a GitHub release when a vX.Y tag is pushed, then starts the PyPI # publishing workflow for that tag. # # A release created with the default GITHUB_TOKEN does not trigger other # workflows, so the "release: published" trigger in publish.yml never fires for # it. publish.yml is therefore started explicitly through workflow_dispatch, # which GITHUB_TOKEN is allowed to trigger. # # If a release for the tag already exists (for example one created by hand in # the web UI), nothing is done: publishing that release already triggered # publish.yml. name: Release on: push: tags: - "v[0-9]+.[0-9]+" permissions: contents: write actions: write jobs: release: runs-on: ubuntu-latest env: GH_TOKEN: ${{ github.token }} GH_REPO: ${{ github.repository }} TAG: ${{ github.ref_name }} steps: - name: Check the tag format id: check run: | if [[ "$TAG" =~ ^v[0-9]+\.[0-9]+$ ]]; then echo "valid=true" >> "$GITHUB_OUTPUT" else echo "::notice::Tag $TAG is not in the vX.Y form; no release created." echo "valid=false" >> "$GITHUB_OUTPUT" fi - name: Create the release id: create if: steps.check.outputs.valid == 'true' run: | if gh release view "$TAG" > /dev/null 2>&1; then echo "Release $TAG already exists; skipping." echo "created=false" >> "$GITHUB_OUTPUT" exit 0 fi gh release create "$TAG" --verify-tag --title "$TAG" --generate-notes echo "created=true" >> "$GITHUB_OUTPUT" - name: Start publishing to PyPI if: steps.create.outputs.created == 'true' run: gh workflow run publish.yml --ref "$TAG" pytactl-3.2/.github/workflows/test.yml000066400000000000000000000017631526550266300201560ustar00rootroot00000000000000# Copyright (c) 2026 Qualcomm Technologies, Inc. and/or its subsidiaries. # SPDX-License-Identifier: BSD-3-Clause # Runs the test suite against the config set bundled in pytactl/tac_configs/. name: Test on: push: pull_request: workflow_dispatch: permissions: contents: read jobs: test: runs-on: ubuntu-latest strategy: fail-fast: false matrix: python-version: ["3.10", "3.11"] steps: - name: Check out pytactl uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 with: persist-credentials: false - name: Set up Python ${{ matrix.python-version }} uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0 with: python-version: ${{ matrix.python-version }} - name: Install dependencies run: | python -m pip install --upgrade pip pip install .[dev] - name: Run the test suite run: | python -m pytest -v pytactl-3.2/.github/workflows/upstream-config-sync.yml000066400000000000000000000122741526550266300232530ustar00rootroot00000000000000# Copyright (c) 2026 Qualcomm Technologies, Inc. and/or its subsidiaries. # SPDX-License-Identifier: BSD-3-Clause # Compares the TAC configs vendored in pytactl/tac_configs/ with the upstream # qcom-test-automation-controller repository, converted to the shared pinout # format, and proposes a pull request when upstream has changed. # # Differences listed in scripts/known-config-differences.json are upstream # changes deliberately not taken; they do not trigger a pull request for as long # as upstream still matches the fingerprint recorded for them. Everything else # that differs is applied file by file (see scripts/sync_upstream_configs.py). # Upstream changes for BugHopper V1 and V2 boards, configs and catalog entries # alike, are never taken. # # When the test suite fails against the synced configs the pull request is # still proposed, as a draft with the failing tests listed, and the run fails. # # The pull request is opened from a fixed branch, so a later run with further # upstream changes updates the open one instead of opening another. name: Upstream config sync on: workflow_dispatch: schedule: # Weekly, on Mondays. - cron: "0 6 * * 1" permissions: contents: write pull-requests: write concurrency: group: upstream-config-sync cancel-in-progress: false jobs: sync: runs-on: ubuntu-latest steps: - name: Check out pytactl uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 with: # Nothing here pushes with the checkout credential: the pull request # is created by create-pull-request, which unsets whatever checkout # persisted and configures its own from its "token" input. persist-credentials: false - name: Check out qcom-test-automation-controller uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 with: repository: qualcomm/qcom-test-automation-controller path: upstream # Read-only clone of a public repository, and it is deleted again # before the pull request is built. persist-credentials: false - name: Set up Python uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0 with: python-version: "3.11" - name: Install pytactl run: | python -m pip install --upgrade pip # Editable, so the tests below load the synced configs from the tree. pip install -e .[dev] - name: Compare and apply new upstream differences id: sync run: | python scripts/sync_upstream_configs.py upstream --apply \ --summary "$RUNNER_TEMP/summary.md" cat "$RUNNER_TEMP/summary.md" >> "$GITHUB_STEP_SUMMARY" echo "commit=$(git -C upstream rev-parse --short=12 HEAD)" >> "$GITHUB_OUTPUT" # The upstream checkout is not part of the change. rm -rf upstream # A failure does not stop the pull request: the changes still need a # reviewer to decide what to take. The failure is reported in it instead. - name: Run the test suite against the synced configs id: tests continue-on-error: true run: | if [ -z "$(git status --porcelain -- pytactl/tac_configs scripts/known-config-differences.json)" ]; then echo "No changes; skipping." exit 0 fi set -o pipefail python -m pytest -q 2>&1 | tee "$RUNNER_TEMP/pytest.log" - name: Report test failures in the pull request if: steps.tests.outcome == 'failure' run: | { echo echo "## Warning: the test suite fails against these configs" echo echo "This pull request is opened as a draft until that is resolved." echo echo '```' sed -n '/short test summary info/,$p' "$RUNNER_TEMP/pytest.log" echo '```' } >> "$RUNNER_TEMP/summary.md" - name: Propose a pull request uses: peter-evans/create-pull-request@22a9089034f40e5a961c8808d113e2c98fb63676 # v7.0.11 with: # Pull requests opened with the default GITHUB_TOKEN do not trigger # other workflows; set CONFIG_SYNC_TOKEN to a PAT for CI to run on them. token: ${{ secrets.CONFIG_SYNC_TOKEN || github.token }} branch: upstream-config-sync delete-branch: true title: "Sync TAC configs with upstream ${{ steps.sync.outputs.commit }}" commit-message: | Sync TAC configs with upstream ${{ steps.sync.outputs.commit }} Apply the upstream qcom-test-automation-controller config changes not listed in scripts/known-config-differences.json. signoff: true draft: ${{ steps.tests.outcome == 'failure' }} body-path: ${{ runner.temp }}/summary.md add-paths: | pytactl/tac_configs scripts/known-config-differences.json # Keep the run red when the suite failed, after the pull request is up. - name: Fail when the test suite failed if: steps.tests.outcome == 'failure' run: | echo "::error::The test suite fails against the synced configs." exit 1 pytactl-3.2/.gitignore000066400000000000000000000002061526550266300150360ustar00rootroot00000000000000# Python bytecode __pycache__/ *.py[cod] # Packaging / build artifacts build/ dist/ *.egg-info/ # Virtual environments venv/ .venv/ pytactl-3.2/60-pytactl.rules000066400000000000000000000023661526550266300160360ustar00rootroot00000000000000# alpaca SUBSYSTEM=="usb", ATTR{idVendor}=="05c6", ATTR{idProduct}=="9302", MODE="0660", GROUP="plugdev", TAG+="uaccess" # alpaca lite (FTDI FT4232H) SUBSYSTEM=="usb", ATTR{idVendor}=="0403", ATTR{idProduct}=="6011", ATTR{product}=="ALPACA-LITE*", MODE="0660", GROUP="plugdev", TAG+="uaccess" # RIDE MX 4.0 Lite (FTDI FT4232H) SUBSYSTEM=="usb", ATTR{idVendor}=="0403", ATTR{idProduct}=="6011", ATTR{product}=="RIDE MX 4.0 Lite", MODE="0660", GROUP="plugdev", TAG+="uaccess" # RIDE MICRO 4.0 (FTDI FT4232H) SUBSYSTEM=="usb", ATTR{idVendor}=="0403", ATTR{idProduct}=="6011", ATTR{product}=="RIDE MICRO 4.0", MODE="0660", GROUP="plugdev", TAG+="uaccess" # Hamoa Lite (FTDI FT4232H) SUBSYSTEM=="usb", ATTR{idVendor}=="0403", ATTR{idProduct}=="6011", ATTR{product}=="Hamoa Lite", MODE="0660", GROUP="plugdev", TAG+="uaccess" # TDP535 JTAG mux (FTDI FT4232H) SUBSYSTEM=="usb", ATTR{idVendor}=="0403", ATTR{idProduct}=="6011", ATTR{product}=="TDP535_JTAG_MUX_DC", MODE="0660", GROUP="plugdev", TAG+="uaccess" # bughopper v1 SUBSYSTEM=="usb", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6015", MODE="0660", GROUP="plugdev", TAG+="uaccess" # bughopper v2 SUBSYSTEM=="hidraw", ATTRS{idVendor}=="2341", ATTRS{idProduct}=="b001", MODE="0660", GROUP="plugdev", TAG+="uaccess" pytactl-3.2/CHANGELOG.md000066400000000000000000000342711526550266300146700ustar00rootroot00000000000000# Changelog All notable changes to this project are documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). ## [Unreleased] ## [3.2] - 2026-10-19 ### Added - Bughopper V1 and V2 boards have a `wakeUp` quick method that pulses VOL_DOWN for 300 ms to wake the target from suspend. The JCTL header carries no power key, and VOL_DOWN is a wakeup source on the Arduino UNO Q. - A `listconfigs` subcommand lists the TAC configs pytactl finds: the config directory in use, each `devicelist.json` entry with its config file, and config files no entry refers to. It exits non-zero when a referenced config is missing or cannot be loaded ([#31](https://github.com/qualcomm/pytactl/issues/31)). ### Deprecated - `pytactl installconfigs` is deprecated and will be removed in a future release ([#32](https://github.com/qualcomm/pytactl/issues/32)). It installs raw upstream configs, without the fixes the bundled set carries, and the installed set then replaces the bundled one for every command not given `--tac-config-path`, across pytactl upgrades. The command now warns when run, and the board commands warn whenever they fall back to an installed set. Use `convertconfigs` with `--tac-config-path` for a config set of your own, and delete the installed directory to go back to the bundled configs. ### Changed - The `60-pytactl.rules` udev rule for PSoC Alpaca boards (`05c6:9302`) uses mode `0660` instead of `0666`, like the other rules: access is granted to the `plugdev` group and, through `uaccess`, to the local session user, rather than to every user on the system. ### Fixed - `60-pytactl.rules` grants access to FTDI-based debug boards (`0403:6011`): Alpaca-Lite, RIDE MX 4.0 Lite, RIDE MICRO 4.0, Hamoa Lite and TDP535 JTAG mux. Without it they could only be driven as root. - The test suite no longer needs git. The two tests that read a real git checkout skip when git is not installed, and the provenance tests that only need a checkout's description stub it instead, so they run everywhere ([#33](https://github.com/qualcomm/pytactl/issues/33)). ## [3.1] - 2026-10-05 ### Added - An "Upstream config sync" GitHub workflow runs weekly, converts the upstream qcom-test-automation-controller configs with `scripts/sync_upstream_configs.py` and proposes a pull request when the bundled set has drifted. Upstream changes deliberately not taken are listed in `scripts/known-config-differences.json` and do not trigger a pull request until upstream changes that file again. ### Changed - Bundled configs are synced with upstream per file, so they may name different upstream commits in their `source` annotation. ### Fixed - `TAC_PSOC_35` uses a 2 second `powerDelay` instead of 18 seconds, which made the RB1 board reboot after it had already started booting. ## [3.0] - 2026-10-02 This release moves pytactl from the combined upstream `.tcnf` config files to the shared pinout format, and bundles the full board config set with the package. A config directory installed by 2.0 is no longer picked up as is. ### Breaking - Board configs are loaded from `*.pinout.json` files instead of the combined `.tcnf` files. A config directory installed by 2.0 holds only `.tcnf` files, which are no longer found: re-run `pytactl installconfigs`, convert it in place with `pytactl convertconfigs `, or delete it to fall back to the bundled set. - Config scripts must indent statements with a single tab. Configs that break this are rejected with a `ConfigScriptError` rather than loaded, so a raw upstream `.tcnf` passed to `--config-file-path` may fail where the converted config loads. ### Added - `pytactl convertconfigs ` converts a directory of TAC config files into the shared pinout format, in place or into `--output `, with `--dry-run` and `--write-overlay`. - `pytactl.tacconfig`, the module behind that conversion: it splits a combined config into the hardware pinout and the UI overlay, merges them back, and loads a config file in any of the three shapes. - The full board config set is now added into `pytactl/tac_configs/` and ships with the package, so FTDI, PSOC and PIC32CX boards can be driven straight after install with no `installconfigs` step and no network access. `pytactl/tac_configs/README.md` records the upstream commit it was taken from and how to refresh it. `installconfigs` still pulls the current upstream set when you want something newer than the snapshot, and what it installs keeps taking precedence over the bundled set. - Converted configs are annotated with where they came from: a `source` object naming the repository, the commit (resolved from the ref at import time, so it does not move), the directory and the upstream file. `convertconfigs` reads this from the git checkout it is pointed at and `installconfigs` from the config repository, so a refresh re-stamps the set; an already annotated config is left alone rather than restamped from wherever it now sits. - `convertconfigs --default-config ` sets the file that `devicelist.json` entries with no config of their own point at, for a destination that holds the FTDI Alpaca-Lite default under a name other than `default.pinout.json` - as the bundled set does. - A ready-made `60-pytactl.rules` udev rules file ships in the repository, so USB access for non-root users is set up by copying it into `/etc/udev/rules.d/` instead of writing rules by hand. It also covers BugHopper v1, which the rules documented in the README were missing. ### Fixed - `TAC_FTDI_51`, `TAC_FTDI_52` and `TAC_FTDI_77` now load. Each indents two script lines with spaces where the config format calls for a tab, which made the whole config unloadable. `installconfigs` and `convertconfigs` re-indent scripts with tabs as they import them, logging each file they touch, so the bundled set and anything imported through either command is clean. - The example Alpaca udev rule in the README gains the missing `TAG+="uaccess"`, without which it granted no access to the logged-in user. - Config-dependent tests skip, rather than fail, when no config set is available, so the suite passes in isolated builds such as Debian packaging. `PYTACTL_TAC_CONFIG_DIR` points the tests at a config set kept elsewhere. - PIC32CX configs are tested through the PIC32CX parser rather than falling through to the FTDI one, which broke the tests when upstream added a new PIC32CX platform. ### Changed - pytactl now loads board configs from `*.pinout.json` - the hardware half of the upstream config split - instead of the combined `.tcnf` files. The UI half (tabs, buttons, labels, tooltips, grid cells) is no longer parsed at all. A single config file passed with `--config-file-path` may still be a legacy combined `.tcnf`, or the UI overlay of a split pair; both are converted on load. - `pytactl installconfigs` converts what it downloads, so the installed config set is `.pinout.json` files plus a `devicelist.json` whose `configPath` entries point at them. It is no longer needed to drive a board, but a config directory left by an earlier version holds `.tcnf` files that are no longer found: re-run `installconfigs`, convert it in place with `pytactl convertconfigs `, or delete it to fall back to the bundled set. - The default FTDI Alpaca-Lite config is `TAC_FTDI_13.pinout.json` in the bundled set, and is installed by `installconfigs` as `default.pinout.json` rather than `default.tcnf`. Either name is accepted wherever that config is looked up, so a config directory does not have to carry both. - The port layout of a board driven from a single config file is derived from the config's `platform_type` instead of being guessed from the file name, so a config file may now be named anything. - A script that uses a variable the config never declares (`delay $edl` with no `edl` in `variables`) now raises `ConfigScriptError` naming the variables and what the config does declare, instead of reaching `exec()` as an opaque `SyntaxError`. The value is a board timing only the config can supply, so pytactl says so rather than guessing one. - A config script must indent statements with a single tab. The parser rejects anything else with a `ConfigScriptError` naming the offending lines, instead of accepting whatever whitespace is there: indentation is part of the config file format, and a config that breaks it is one to fix. A raw upstream `.tcnf` passed to `--config-file-path` may therefore be rejected where the converted config loads - convert the directory first. A config directory installed by an earlier version may need `installconfigs` re-running. - Loading a config warns when its script drives a command no pin defines, naming the commands. Several upstream configs carry lines for hardware the board does not have; that used to surface only as an `AttributeError` from inside the script, typically when someone tried to power a board on. - The rule that a pin disabled in the UI gives way to an enabled pin sharing its command name now lives in the conversion rather than in board loading. `enabled` is a UI field and does not survive into the pinout file, so the decision is made once, up front; the resulting pin set is unchanged. ## [2.0] - 2026-08-21 The first release published to [PyPI](https://pypi.org/project/pytactl/). This release turns a pair of in-tree scripts into an installable command line tool, so it carries a number of breaking changes for anyone upgrading from 1.4. ### Breaking - The project and its command are renamed from `pytac` to `pytactl`. The old name collides with an unrelated package on PyPI (Diamond Light Source's Python Toolkit for Accelerator Controls), so the project could never be published under it. Existing installs must switch to the `pytactl` command, and the installed config set moves from the `pytac` per-user data directory (`~/.local/share/pytac` on Linux) to `pytactl` - re-run `pytactl installconfigs` or copy the old directory over. - Run modes are now subcommands rather than mutually exclusive flags: `pytactl shell`, `pytactl oneshot` and `pytactl service` replace `--shell`, `--oneshot` and `--service`. Each subcommand has its own help and argument set. - The flat modules were restructured into an importable `pytactl` package and are driven through a single console entry point, replacing the previous per-script invocation from a checkout. - Dependencies are declared in `pyproject.toml` instead of `requirements.txt`, which is removed. The `pyudev` dependency is dropped in favour of `pyserial`, and `platformdirs` is added. ### Added - Packaging metadata and a console entry point, making the tool installable with `pip` and `pipx` and runnable from anywhere. - `pytactl list` enumerates connected debug boards with their type and serial number, so the value needed for `--serial` is discoverable from the tool itself instead of `udevadm` or `lsusb`. - `pytactl installconfigs` downloads every `.tcnf` file and `devicelist.json` from the TAC config repository into a local directory (the per-user data directory by default). The `--config-repository`, `--local-path`, `--ref` and `--repository-path` flags override the source repository, install location, git ref and in-repo path. - `pytactl oneshot` runs a single command against a board and exits, for use in CI jobs, provisioning and other scripted automation. - Support for the PIC32CX board used on automotive platforms. - A pytest suite: smoke tests covering the package version, the default config path and the CLI parser, plus a CI job that pulls the upstream configs and checks that `powerOn`, `powerOff` and `bootToEDL` load and run for each one. - A `Makefile` with `lint`, `format`, `test` and `install-dev` targets, so contributors and CI run the same checks. - `SECURITY.md` documenting how to report a vulnerability, and a workflow that builds and publishes releases to PyPI via Trusted Publishing. ### Changed - Board detection uses `pyserial`'s `serial.tools.list_ports` instead of `pyudev`, which depends on Linux-only `libudev`. Board enumeration, PIC32CX detection and serial port resolution now work on macOS and Windows as well as Linux. - `--serial` may be omitted when exactly one board is connected; the tool assumes that board, matching how `adb` and `fastboot` behave. - The default config directory prefers the config set installed by `installconfigs` when it is populated, falling back to the configs bundled with the package. - The FTDI board fallback prefers `default.tcnf`, keeping `TAC_FTDI_13.tcnf` for the bundled case. - `ruff` replaces `black`, `isort` and `pylint` for formatting, import ordering and linting, collapsing three CI jobs into one. - The README documents `pipx` installation, the native `hidapi` system dependency for Ubuntu/Debian and Fedora, the udev rules needed for Bughopper V2 (notably under WSL2), and the `installconfigs` and `oneshot` subcommands. ### Fixed - GPIO commands on Windows: a `0x00` HID report-ID placeholder is prepended to each write, since hidapi consumes byte 0 as the report ID. Without it the `CMD_GPIO` byte was stripped and the board never rebooted, which went unnoticed on Linux/hidraw. - Config script parsing now handles `//` comments, and pin and function names that are not valid Python identifiers (for example `12vpoweroff`), so config files can be used unchanged. - Pins marked as disabled but still referenced by a script are handled without losing the name-collision behaviour that keeps disabled pins out. - `except:` was replaced with `except Exception:` so `KeyboardInterrupt` and `SystemExit` are no longer swallowed. ## [1.4] - 2026-06-10 Earlier releases are recorded in the git history and in the [GitHub releases](https://github.com/qualcomm/pytactl/releases) page. [Unreleased]: https://github.com/qualcomm/pytactl/compare/v3.2...HEAD [3.2]: https://github.com/qualcomm/pytactl/compare/v3.1...v3.2 [3.1]: https://github.com/qualcomm/pytactl/compare/v3.0...v3.1 [3.0]: https://github.com/qualcomm/pytactl/compare/v2.0...v3.0 [2.0]: https://github.com/qualcomm/pytactl/compare/v1.4...v2.0 [1.4]: https://github.com/qualcomm/pytactl/releases/tag/v1.4 pytactl-3.2/CONTRIBUTING.md000066400000000000000000000033161526550266300153040ustar00rootroot00000000000000# Contributing to pytactl Hi there! We’re thrilled that you’d like to contribute to this project. Your help is essential for keeping this project great and for making it better. ## Branching Strategy In general, contributors should develop on branches based off of `main` and pull requests should be made against `main`. ## Submitting a pull request 1. Please read our [license](LICENSE). 1. [Fork](https://github.com/qualcomm/pytactl/fork) and clone the repository. ```bash git clone https://github.com//pytactl.git ``` 1. Create a new branch based on `main`: ```bash git checkout -b main ``` 1. Create an upstream `remote` to make it easier to keep your branches up-to-date: ```bash git remote add upstream https://github.com/qualcomm/pytactl.git ``` 1. Make your changes, add tests, and make sure the tests still pass. 1. Commit your changes using the [DCO](https://developercertificate.org/). You can attest to the DCO by commiting with the **-s** or **--signoff** options or manually adding the "Signed-off-by": ```bash git commit -s -m "Really useful commit message"` ``` 1. After committing your changes on the topic branch, sync it with the upstream branch: ```bash git pull --rebase upstream main ``` 1. Push to your fork. ```bash git push -u origin ``` The `-u` is shorthand for `--set-upstream`. This will set up the tracking reference so subsequent runs of `git push` or `git pull` can omit the remote and branch. 1. [Submit a pull request](https://github.com/qualcomm/pytactl/pulls) from your branch to `main`. 1. Pat yourself on the back and wait for your pull request to be reviewed. pytactl-3.2/LICENSE000066400000000000000000000027061526550266300140620ustar00rootroot00000000000000Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. pytactl-3.2/Makefile000066400000000000000000000011171526550266300145100ustar00rootroot00000000000000# Copyright (c) 2026 Qualcomm Technologies, Inc. and/or its subsidiaries. # SPDX-License-Identifier: BSD-3-Clause PY_FILES := $(shell git ls-files '*.py') .PHONY: lint format install-dev test # Install the linting/formatting toolchain (ruff). install-dev: python -m pip install --upgrade pip pip install -e ".[dev]" # Check formatting and lint rules. Used locally and in CI. lint: ruff check $(PY_FILES) ruff format --check $(PY_FILES) # Auto-fix lint issues and reformat in place. format: ruff check --fix $(PY_FILES) ruff format $(PY_FILES) # Run the test suite. test: pytest pytactl-3.2/README.md000066400000000000000000000317301526550266300143330ustar00rootroot00000000000000# pytactl Python implementation of Test Automation Controller (TAC/Alpaca) for controlling Qualcomm debug boards. It uses config files and PSOC firmware from the original TAC (Alpaca) system. # Installation Install the `pytactl` command on your system from [PyPI](https://pypi.org/project/pytactl/) with [pipx](https://pipx.pypa.io): pipx install pytactl To install from a checkout of this repository instead: pipx install . This puts a single `pytactl` entry point on your `PATH`. Note that the `hid` dependency needs `libhidapi` package to be installed (required for Bughopper V2 boards). Alternatively, for development in a virtualenv: virtualenv -p python3 venv . ./venv/bin/activate pip install -e . Run `pytactl -h` to see all available options. ## System dependencies pytactl uses `hidapi` for HID-based debug boards, including Bughopper V2. Install the native HIDAPI library before installing or running `pytactl`. ### Ubuntu / Debian ```bash sudo apt update sudo apt install -y libhidapi-hidraw0 libhidapi-libusb0 ``` ### Fedora ```bash sudo dnf install -y hidapi ``` ## USB permissions By default, USB devices are not accessible without root. Install the udev rules file to have access to the supported boards as an user: sudo cp 60-pytactl.rules /etc/udev/rules.d/ sudo udevadm control --reload-rules && sudo udevadm trigger Then make sure your user is in the `plugdev` group (log out and back in after): sudo usermod -aG plugdev $USER # Configuration **Bughopper boards (V1 and V2) work out of the box.** They are self-describing and need no config files. **All other debug boards (FTDI, PSOC, PIC32CX) are driven from a configuration file, and the configs ship with pytactl.** They live in `pytactl/tac_configs/`, vendored from [qcom-test-automation-controller](https://github.com/qualcomm/qcom-test-automation-controller/tree/main/configurations) and converted to the pinout format pytactl loads (see [Config file format](#config-file-format) below). Nothing needs fetching before a board can be driven: pytactl shell --serial `pytactl/tac_configs/README.md` records the upstream commit the set was taken from. ## Listing the configs pytactl finds `listconfigs` shows which config directory pytactl uses (the installed set, the bundled one, or the one given with `--tac-config-path`), each debug board `devicelist.json` lists with its config file, platform id and USB descriptor, and any config file no board entry refers to: pytactl listconfigs --log-level INFO Every config a board entry refers to is loaded, and a missing or unreadable one is flagged. The command exits with status 1 when `devicelist.json` cannot be read, lists no boards, or refers to a missing or invalid config, so it can serve as a check that the configs are installed (for example in a distribution's package tests). Config scripts are not parsed; a script error is reported when a board is driven with that config. ## Using a different config set `--tac-config-path ` points pytactl at another directory of configs; without it, the bundled set is used. To use configs that are not in the bundled set — a newer checkout of qcom-test-automation-controller, configs for boards of your own, or a config edited in QTAC — convert their `configurations/` directory and point pytactl at the result: pytactl convertconfigs /path/to/qcom-test-automation-controller/configurations \ --output /path/to/install pytactl shell --tac-config-path /path/to/install --serial Without `--output` the configs are converted in place, beside the originals. `--dry-run` reports what would be written without writing it, and `--write-overlay` also writes the UI half of each config (see below), producing the complete two-file layout rather than only the half pytactl uses. Note: some configs in qcom-test-automation-controller currently have syntax issues, and the bundled set carries fixes upstream does not have (see `scripts/known-config-differences.json`); pick the ones that match your board. ### `installconfigs` (deprecated) `pytactl installconfigs` downloads every config file and `devicelist.json` from the config repository, converts them, and installs the result into a per-user data directory (resolved with [platformdirs](https://pypi.org/project/platformdirs/), e.g. `~/.local/share/pytactl` on Linux). It is deprecated and will be removed in a future release: - the installed configs are raw upstream, without the fixes the bundled set carries; - once that directory is populated, every command not given `--tac-config-path` uses it instead of the bundled set, and keeps doing so after pytactl is upgraded. pytactl logs a warning whenever it falls back to the installed set. Delete the directory to go back to the bundled configs, and use `convertconfigs` with `--tac-config-path` for a config set of your own. `pytactl listconfigs` shows which directory is in use. ## Config file format Upstream stores one config file per debug board. Historically that was a single combined `.tcnf` file holding the hardware pinout, the automation script *and* the Qt UI layout (tabs, buttons, labels, tooltips, grid cells). [PR #54](https://github.com/qualcomm/qcom-test-automation-controller/pull/54) splits that into two sibling files, so the hardware description can be reused outside the QTAC application: | File | Contents | |------|----------| | `TAC__.pinout.json` | Pins, bus map, script variables and the Alpaca script. Self-describing: `"format": "tac-pinout"`. | | `TAC__.tcnf` | UI layout only, linked to its pinout file through `pinout_ref`. | pytactl drives hardware and has no UI, so it loads the `.pinout.json` half and ignores the overlay. `pytactl.tacconfig` implements the same split (it reproduces upstream's own output for every config in that PR), which is what `installconfigs` and `convertconfigs` apply, so pytactl does not have to wait for the split to land upstream and will consume upstream's `.pinout.json` files unchanged once it does. All three shapes are accepted wherever a single config file is given with `--config-file-path`: a `.pinout.json`, a split `.tcnf` (its `pinout_ref` sibling is loaded from the same directory), or a legacy combined `.tcnf`, which is converted in memory. One thing does not survive the split unaided: `enabled` is a UI field, but several configs wire the same command name to two physical pins and disable one of them. The conversion therefore drops a disabled pin when an enabled pin claims the same command, so the command keeps driving the line it drove before. ### Script indentation A config's `script` is written in the "Alpaca" automation language: a `def` at column 0 and its body **indented with a single tab**, with no nested blocks. def powerOn() → battery 1 → delay 800 → pkey 0 pytactl requires that tab. A statement indented with spaces — or with more than one tab — is rejected at load time with a `ConfigScriptError` naming the offending lines, rather than being quietly accepted: indentation is part of the config file format, and a config that does not follow it is a config to fix, not to work around. `installconfigs` and `convertconfigs` re-indent scripts with tabs as they import them and log each file they touch, so configs that come through either command satisfy the rule and the set bundled with pytactl already does. Three upstream configs (`TAC_FTDI_51`, `TAC_FTDI_52`, `TAC_FTDI_77`) indent two lines each with spaces and are corrected on the way in. This means a **raw** upstream `.tcnf` handed straight to `--config-file-path` may be rejected where the converted config loads. That is deliberate — convert the directory first: pytactl convertconfigs /path/to/qcom-test-automation-controller/configurations \ --output /path/to/install If you are upgrading and a board that used to work now reports a `ConfigScriptError`, your installed config directory predates this rule: delete it to use the bundled configs, or run `pytactl convertconfigs ` to normalise it in place. ### Provenance annotation `installconfigs` and `convertconfigs` stamp each config they write with where it came from, in a `source` object below the format envelope — the repository, the commit (a ref like `main` moves, so the SHA it resolved to at import time is what gets recorded), the directory within the repository, and the upstream file name: { "$schema": "https://qualcomm.github.io/tac/schemas/pinout-1.0.json", "format": "tac-pinout", "schema_version": "1.0", "source": { "repository": "https://github.com/qualcomm/qcom-test-automation-controller.git", "commit": "757cc972c88e4a1098881b2bc73f3d53eac286be", "path": "configurations", "file": "TAC_FTDI_15.tcnf" }, ... } `convertconfigs` reads this from the git checkout it is pointed at, and leaves an already annotated config alone, so re-converting an imported set in place does not restamp it with the wrong repository. This is pytactl's one addition to the format: upstream's `schemas/pinout-1.0.json` sets `"additionalProperties": false`, so an annotated config does not validate against it unchanged. Pass `--no-annotate` to either subcommand for configs that must. `devicelist.json` maps board hardware IDs to their config files, and must be present in the `--tac-config-path` directory for FTDI/PSOC boards. `installconfigs` and `convertconfigs` rewrite its `configPath` entries to the converted file names. Example entry for a PSOC board: { "catalog": [ { "platform_id": 17, "configPath": "TAC_PSOC_17.pinout.json" } ] } ## Finding your board's serial number The `--serial` argument takes the USB serial number, not a device path. The easiest way to discover connected boards and their serial numbers is the `list` subcommand: pytactl list It prints every recognised debug board with its type, USB vendor/product ID, and serial number (read from udev, the same `ID_SERIAL_SHORT` value you pass to `--serial`): Connected debug boards: Bughopper V1 vid:pid=0403:6015 serial=DP05DIAN PSOC vid:pid=05c6:9302 serial=0123456789 Alternatively, find it manually with `udevadm`: udevadm info /dev/ttyACM0 | grep ID_SERIAL_SHORT Or using `lsusb` (replace `VID:PID` with `0403:6011` for FTDI or `05c6:9302` for PSOC): lsusb -v -d VID:PID | grep iSerial # Using as a shell Start the interactive shell with the `shell` subcommand: pytactl shell --serial Optional arguments: --tac-config-path # use a config directory other than the bundled one (see Configuration) --log-level DEBUG # log verbosity (default: DEBUG) Once started, the shell prompt accepts commands generated from your board's config script. The available commands depend on the config — not all boards define every command (e.g. newer configs may omit `powerOn`/`powerOff`). Typical commands: **Power control:** powerOn powerOff devicePowerOn devicePowerOff usbDevicePowerOn usbDevicePowerOff **Boot modes:** bootToEDL bootToFastboot bootToUEFI reset **GPIO pins** (use with `1` to assert, `0` to deassert): pkey 1 # press power key pkey 0 # release power key volup 1 voldn 1 Type `help` in the shell to list all commands available for your specific board. # Running a single command Use the `oneshot` subcommand to run one command and exit, without entering the interactive shell. This is handy for scripting: pytactl oneshot bootToEDL --serial pytactl oneshot reset --serial GPIO pin commands take an integer value (`1` to assert, `0` to deassert): pytactl oneshot pkey 1 --serial pytactl oneshot pkey 0 --serial The same commands available in the shell can be used here. An unknown command exits with an error listing the commands supported by your board. # Using as a service pytactl service --serial [ ...] The REST API runs on `http://localhost:5000`. Example usage with curl: # List connected boards curl http://localhost:5000/ # List available quick methods (bootToEDL, powerOn, etc.) curl http://localhost:5000//quick # Power on/off curl -X PUT http://localhost:5000//quick/powerOn curl -X PUT http://localhost:5000//quick/powerOff # Boot to EDL curl -X PUT http://localhost:5000//quick/bootToEDL # Boot to fastboot curl -X PUT http://localhost:5000//quick/bootToFastboot # Set a named pin curl -X PUT "http://localhost:5000//command/reset?value=1" # Set a raw pin (e.g., bus A, pin 0) curl -X PUT "http://localhost:5000//pin/A0?value=1" Note: REST API server runs in debug mode. Running with multiple concurrent threads may lead to unexpected behaviour. # License pytactl is licensed under the [BSD-3-clause License](https://spdx.org/licenses/BSD-3-Clause.html). See [LICENSE](LICENSE) for the full license text. pytactl-3.2/SECURITY.md000066400000000000000000000023671526550266300146510ustar00rootroot00000000000000How to Report a Potential Vulnerability? ======================================== If you would like to report a public issue (for example, one with a released CVE number), please report it as a [GitHub issue](https://github.com/qualcomm/pytactl/issues/new). If you have a patch ready, submit it following the same procedure as any other patch as described in [CONTRIBUTING.md](CONTRIBUTING.md). If you are dealing with a not-yet released or urgent issue, please contact us via our [Product Security team](mailto:product-security@qualcomm.com) or see our [Report a Bug](https://www.qualcomm.com/company/product-security/report-a-bug) page. Please include the following details while reporting a vulnerability: - Description of the vulnerability - Steps to reproduce - Affected versions - Potential impact - Any relevant logs or screenshots ## Coordinated Disclosure We follow a Coordinated Vulnerability Disclosure (CVD) process: - **Initial Response**: We will acknowledge your report within 48 hours. - **Investigation**: Our team will investigate the issue and provide updates. - **Resolution**: We will work with you to resolve the issue and prepare a fix. - **Disclosure**: Once the fix is ready, we will disclose the vulnerability and notify affected users. pytactl-3.2/client.py000066400000000000000000000007031526550266300147000ustar00rootroot00000000000000# Copyright (c)i 2025-2026 Qualcomm Technologies, Inc. and/or its subsidiaries. # SPDX-License-Identifier: BSD-3-Clause import requests # get available boards r = requests.get("http://localhost:5000") print(r.json()) BOARDID = "" # get quick methods for BOARDID r = requests.get(f"http://localhost:5000/{BOARDID}/quick") # call quick method r = requests.put(f"http://localhost:5000/{BOARDID}/quick/bootToEDL") print(r.status_code) print(r.json()) pytactl-3.2/pyproject.toml000066400000000000000000000056121526550266300157700ustar00rootroot00000000000000# Copyright (c) 2026 Qualcomm Technologies, Inc. and/or its subsidiaries. # SPDX-License-Identifier: BSD-3-Clause [build-system] requires = ["setuptools>=77"] build-backend = "setuptools.build_meta" [project] name = "pytactl" dynamic = ["version"] description = "Python Test Automation Controller (TAC/Alpaca) for Qualcomm debug boards" readme = "README.md" requires-python = ">=3.10" license = "BSD-3-Clause" license-files = ["LICENSE"] authors = [ { name = "Qualcomm Technologies, Inc.", email = "qc.opensource@qti.qualcomm.com" }, ] maintainers = [ { name = "Milosz Wasilewski", email = "milosz.wasilewski@oss.qualcomm.com" }, ] keywords = [ "debug-board", "hardware", "qualcomm", "tac", "test-automation", ] classifiers = [ "Development Status :: 5 - Production/Stable", "Environment :: Console", "Intended Audience :: Developers", "Operating System :: MacOS", "Operating System :: Microsoft :: Windows", "Operating System :: POSIX :: Linux", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", "Programming Language :: Python :: 3.13", "Topic :: Software Development :: Embedded Systems", "Topic :: Software Development :: Testing", "Topic :: System :: Hardware", ] dependencies = [ "Flask", "Flask-RESTful", "pyftdi", "pyusb", "pexpect", "pyserial", "requests", "platformdirs", "hid", ] [project.optional-dependencies] dev = ["ruff==0.15.17", "pytest"] [project.scripts] pytactl = "pytactl.cli:main" [project.urls] Homepage = "https://github.com/qualcomm/pytactl" Repository = "https://github.com/qualcomm/pytactl" Issues = "https://github.com/qualcomm/pytactl/issues" Documentation = "https://github.com/qualcomm/pytactl/blob/main/README.md" Changelog = "https://github.com/qualcomm/pytactl/blob/main/CHANGELOG.md" "Security Policy" = "https://github.com/qualcomm/pytactl/blob/main/SECURITY.md" [tool.setuptools] packages = ["pytactl"] # Single source of truth for the version: pytactl/__init__.py [tool.setuptools.dynamic] version = { attr = "pytactl.__version__" } [tool.setuptools.package-data] pytactl = ["tac_configs/*"] [tool.pytest.ini_options] testpaths = ["tests"] pythonpath = ["."] # Ruff configuration (replaces black, isort and pylint) [tool.ruff] target-version = "py310" line-length = 88 [tool.ruff.lint] select = [ "E", # pycodestyle errors "F", # pyflakes "W", # pycodestyle warnings "I", # isort (import ordering) "UP", # pyupgrade "B", # flake8-bugbear "C4", # flake8-comprehensions "SIM", # flake8-simplify ] ignore = [ "E501", # line length is handled by the formatter "B904", # raise-without-from inside except (matches old pylint W0707) "SIM115", # open without a context manager (matches old pylint R1732) ] pytactl-3.2/pytactl/000077500000000000000000000000001526550266300145305ustar00rootroot00000000000000pytactl-3.2/pytactl/__init__.py000066400000000000000000000050441526550266300166440ustar00rootroot00000000000000# Copyright (c) 2025-2026 Qualcomm Technologies, Inc. and/or its subsidiaries. # SPDX-License-Identifier: BSD-3-Clause import os import platformdirs __version__ = "3.2.0" # Configs bundled with the package: a .pinout.json per board plus # devicelist.json, synced from upstream with the fixes pytactl needs. PACKAGE_TAC_CONFIG_PATH = os.path.join(os.path.dirname(__file__), "tac_configs") # Where the deprecated "installconfigs" writes the full config set by default. INSTALLED_TAC_CONFIG_PATH = platformdirs.user_data_dir("pytactl") # Default config repository fetched by "installconfigs". DEFAULT_CONFIG_REPOSITORY = ( "https://github.com/qualcomm/qcom-test-automation-controller/" ) # Filename of the default FTDI Alpaca-Lite config used as a fallback. The upstream # repository has no config file for it (it is generated by # FTDIPlatformConfiguration.cpp), so "installconfigs" copies the bundled pinout # below under this name. DEFAULT_CONFIG_FILENAME = "default.pinout.json" # The same config under the name it has in the config set shipped with the # package, where there is no need for a copy under the generic name. BUNDLED_DEFAULT_CONFIG_FILENAME = "TAC_FTDI_13.pinout.json" def default_tac_config_path(): """Resolve the default TAC config directory. Prefer the installed config set (populated by "installconfigs") when it exists and is non-empty; otherwise fall back to the configs bundled with the package. "installconfigs" is deprecated: the installed set is raw upstream, without the fixes the bundled set carries, and once written it shadows the bundled set across pytactl upgrades. The CLI warns whenever it falls back to it. """ installed = INSTALLED_TAC_CONFIG_PATH if os.path.isdir(installed) and os.listdir(installed): return installed return PACKAGE_TAC_CONFIG_PATH def default_config_file(tac_config_path): """Path of the fallback FTDI Alpaca-Lite config inside a config directory. It goes under two names, both legitimate: a directory populated by "installconfigs" holds a copy named DEFAULT_CONFIG_FILENAME, while the set shipped with the package keeps the config under its own name. Returns ``None`` when the directory holds neither. """ for name in (DEFAULT_CONFIG_FILENAME, BUNDLED_DEFAULT_CONFIG_FILENAME): candidate = os.path.join(tac_config_path, name) if os.path.exists(candidate): return candidate return None # Backwards-compatible module-level default; resolved at import time. DEFAULT_TAC_CONFIG_PATH = default_tac_config_path() pytactl-3.2/pytactl/cli.py000066400000000000000000000303571526550266300156610ustar00rootroot00000000000000#!/usr/bin/env python3 # Copyright (c) 2025-2026 Qualcomm Technologies, Inc. and/or its subsidiaries. # SPDX-License-Identifier: BSD-3-Clause import logging import os import sys from argparse import ArgumentParser from . import ( BUNDLED_DEFAULT_CONFIG_FILENAME, DEFAULT_CONFIG_FILENAME, DEFAULT_CONFIG_REPOSITORY, INSTALLED_TAC_CONFIG_PATH, PACKAGE_TAC_CONFIG_PATH, __version__, default_tac_config_path, ) logger = logging.getLogger() def _setup_logging(level): logger.setLevel(level) handler = logging.StreamHandler(sys.stdout) handler.setLevel(level) formatter = logging.Formatter( "%(asctime)s - %(name)s - %(levelname)s - %(message)s" ) handler.setFormatter(formatter) logger.addHandler(handler) def build_parser(): parser = ArgumentParser( prog="pytactl", description="Test Automation Controller (TAC/Alpaca) for Qualcomm debug boards.", ) parser.add_argument( "--version", action="version", version=f"%(prog)s {__version__}" ) # Options shared by every subcommand. base = ArgumentParser(add_help=False) base.add_argument("--log-level", default="DEBUG", help="Log level (default: DEBUG)") # Options shared by the board-driving subcommands. common = ArgumentParser(add_help=False) common.add_argument( "--serial", nargs="+", help="Debug board serial number(s)", ) # Where to load the TAC configs from. config_path = ArgumentParser(add_help=False) config_path.add_argument( "--tac-config-path", help="Path to directory with TAC configs (devicelist.json + " ".pinout.json files). Defaults to the configs bundled with the " "package, which cover every board upstream ships a config for, unless " "the deprecated 'installconfigs' has installed a set.", ) subparsers = parser.add_subparsers(dest="mode", required=True, metavar="COMMAND") subparsers.add_parser( "list", parents=[base], help="List connected debug boards and their serial numbers", ) shell = subparsers.add_parser( "shell", parents=[base, common, config_path], help="Run the interactive shell" ) shell.add_argument( "--config-file-path", help="Path to a single config file (.pinout.json, or a .tcnf in either " "the split or the legacy combined format); use for debugging the config " "file syntax.", ) oneshot = subparsers.add_parser( "oneshot", parents=[base, common, config_path], help="Run a single command and exit", ) oneshot.add_argument("command", help="Command to run, e.g. bootToEDL") oneshot.add_argument( "value", nargs="?", help="Optional integer value for pin commands, e.g. 1", ) oneshot.add_argument( "--config-file-path", help="Path to a single config file (.pinout.json, or a .tcnf in either " "the split or the legacy combined format); use for debugging the config " "file syntax.", ) subparsers.add_parser( "listconfigs", parents=[base, config_path], help="List the TAC configs found in the config directory and check " "that every devicelist.json entry has a loadable config", ) installconfigs = subparsers.add_parser( "installconfigs", parents=[base], help="(deprecated) Download TAC config files from the config repository " "and convert them to the shared pinout format. The configs bundled with " "pytactl carry fixes upstream does not; use 'convertconfigs' and " "--tac-config-path for a config set of your own", ) installconfigs.add_argument( "--config-repository", default=DEFAULT_CONFIG_REPOSITORY, help="Config repository URL to fetch configs from (default: %(default)s)", ) installconfigs.add_argument( "--local-path", help="Directory to install configs into (default: the platformdirs " "user data directory for pytactl)", ) installconfigs.add_argument( "--ref", default="HEAD", help="Git ref (branch, tag, or commit) to fetch from (default: %(default)s)", ) installconfigs.add_argument( "--repository-path", default="configurations", help="Path within the repository holding the configs (default: %(default)s)", ) installconfigs.add_argument( "--no-annotate", action="store_true", help="Do not record the repository, ref and commit the configs were " "imported from in each converted config", ) convertconfigs = subparsers.add_parser( "convertconfigs", parents=[base], help="Convert a directory of TAC config files to the shared pinout " "format (.pinout.json)", ) convertconfigs.add_argument( "source", help="Directory holding the TAC config files to convert (e.g. the " "'configurations' directory of a qcom-test-automation-controller " "checkout)", ) convertconfigs.add_argument( "--output", help="Directory to write the converted configs into (default: convert " "in place)", ) convertconfigs.add_argument( "--write-overlay", action="store_true", help="Also write the slim UI overlay (.tcnf) beside each .pinout.json, " "producing the complete two-file layout instead of only the half " "pytactl needs", ) convertconfigs.add_argument( "--default-config", default=DEFAULT_CONFIG_FILENAME, help="File name that devicelist.json entries with no config of their " "own should point at (default: %(default)s). The config set bundled " "with pytactl keeps the FTDI Alpaca-Lite default under its own name " f"rather than a copy, so refreshing it passes {BUNDLED_DEFAULT_CONFIG_FILENAME} here.", ) convertconfigs.add_argument( "--dry-run", action="store_true", help="Report what would be converted without writing anything", ) convertconfigs.add_argument( "--no-annotate", action="store_true", help="Do not record the repository and commit of the source checkout in " "each converted config. Annotated configs carry an extra 'source' key, " "which upstream's pinout schema does not allow; use this for configs " "that must validate against it unchanged", ) service = subparsers.add_parser( "service", parents=[base, common, config_path], help="Run the REST API service" ) service.add_argument( "--hostname", default="0.0.0.0", help="Host name the server attaches to (default: 0.0.0.0)", ) service.add_argument( "--port", default=5000, type=int, help="Port on the host to attach to (default: 5000)", ) return parser def _list_boards(): from .debugboard import Board boards = Board.list_boards() if not boards: print("No connected debug boards found.") return print("Connected debug boards:") for board in boards: serial = board["serial"] or "" vid_pid = f"{board['vid']:04x}:{board['pid']:04x}" print(f" {board['type']:<14} vid:pid={vid_pid} serial={serial}") def _list_configs(tac_config_path): from .tacconfig import list_directory if os.path.realpath(tac_config_path) == os.path.realpath(PACKAGE_TAC_CONFIG_PATH): origin = "bundled with pytactl" elif os.path.realpath(tac_config_path) == os.path.realpath( INSTALLED_TAC_CONFIG_PATH ): origin = "installed by installconfigs" else: origin = "set with --tac-config-path" print(f"TAC config directory: {tac_config_path} ({origin})") try: listing = list_directory(tac_config_path) except (OSError, ValueError) as error: print(f"Cannot read devicelist.json: {error}") return False entries = listing["entries"] if not entries: print("devicelist.json lists no debug boards.") return False name_width = max(len(entry["name"]) for entry in entries) config_width = max(len(entry["configPath"]) for entry in entries) print(f"Configs for {len(entries)} debug boards:") for entry in entries: line = ( f" {entry['name']:<{name_width}} {entry['configPath']:<{config_width}}" f" platform_id={entry['platform_id']}" ) if entry["usb_descriptor"]: line += f" usb_descriptor={entry['usb_descriptor']!r}" if entry["status"] != "ok": line += f" {entry['status'].upper()}: {entry['error']}" print(line) if listing["unreferenced"]: print("Config files not referenced by devicelist.json:") for name in listing["unreferenced"]: print(f" {name}") broken = [entry for entry in entries if entry["status"] != "ok"] if broken: print(f"{len(broken)} debug board(s) have a missing or invalid config") return False return True def _single_board_serial(boards): if not boards: return None, "no connected debug boards found" if len(boards) > 1: serials = ", ".join( board.get("serial") or "" for board in boards ) return None, f"multiple connected debug boards found: {serials}" serial = boards[0].get("serial") if not serial: return None, "the connected debug board did not report a serial number" return serial, None def _resolve_serial(args, parser, command): if args.serial: return args.serial[0] if args.config_file_path: return None from .debugboard import Board serial, error = _single_board_serial(Board.list_boards()) if serial: logger.info("Using only connected debug board serial %s", serial) return serial parser.error(f"{command} requires --serial or --config-file-path ({error})") def _resolve_tac_config_path(args): if getattr(args, "tac_config_path", False) is not None: return args.tac_config_path = default_tac_config_path() if args.tac_config_path == INSTALLED_TAC_CONFIG_PATH: logger.warning( "Using the TAC configs installed by the deprecated 'installconfigs' " "in %s instead of the configs bundled with pytactl. The installed " "configs lack the fixes the bundled ones carry and are not updated " "with pytactl; delete %s to use the bundled configs, or pass " "--tac-config-path to choose a config directory explicitly.", INSTALLED_TAC_CONFIG_PATH, INSTALLED_TAC_CONFIG_PATH, ) def main(argv=None): parser = build_parser() args = parser.parse_args(argv) _setup_logging(args.log_level) _resolve_tac_config_path(args) if args.mode == "list": _list_boards() elif args.mode == "listconfigs": if not _list_configs(args.tac_config_path): sys.exit(1) elif args.mode == "installconfigs": from .installconfigs import install_configs install_configs( args.config_repository, args.local_path, args.ref, args.repository_path, not args.no_annotate, ) elif args.mode == "convertconfigs": from .installconfigs import convert_configs convert_configs( args.source, args.output, args.write_overlay, args.dry_run, not args.no_annotate, args.default_config, ) elif args.mode == "service": if not args.serial: parser.error("service requires --serial") from .service import run_service run_service(args.serial, args.tac_config_path, args.hostname, args.port) elif args.mode == "oneshot": from .shell import run_oneshot serial = _resolve_serial(args, parser, "oneshot") run_oneshot( args.command, serial, args.config_file_path, args.tac_config_path, args.value, ) else: # shell from .shell import run_shell serial = _resolve_serial(args, parser, "shell") run_shell(serial, args.config_file_path, args.tac_config_path) if __name__ == "__main__": main() pytactl-3.2/pytactl/debugboard.py000066400000000000000000001172521526550266300172100ustar00rootroot00000000000000# Copyright (c)i 2025-2026 Qualcomm Technologies, Inc. and/or its subsidiaries. # SPDX-License-Identifier: BSD-3-Clause import json import keyword import logging import os import re import sys from time import sleep from types import MethodType import serial import serial.tools.list_ports import usb from pexpect import fdpexpect from pyftdi.gpio import GpioAsyncController from . import default_config_file, tacconfig logger = logging.getLogger() try: import hid except ImportError as e: # ignore importing hid. It's only required for bughopper v2. logger.error(e) pass # wait time for other GPIOs to be truly set before touching the reset GPIO PRE_RESET_DELAY = 0.1 # How long the Bughopper holds VOL_DOWN asserted to wake the target from # suspend. VOL_DOWN is a gpio-keys wakeup source on the UNO Q; JCTL carries no # power key, so this is the closest stand-in for a power button press. WAKE_PULSE_DELAY = 0.3 BITMODE_CBUS = 0x20 # USB ctrl transfer request for FT230X CBUS SIO_SET_BITMODE_REQUEST = 0x0B # platform_type values in a TAC config that describe an FTDI-based board. FTDI_PLATFORM_TYPES = ("FTDI", "FT232H") class TACException(Exception): status_code = 420 detail = "Unable to perform requested operation" class ConfigScriptError(TACException): """A config script pytactl cannot turn into callable board commands.""" detail = "Unable to parse the board configuration script" class Board(dict): ID_VENDOR_FTDI = 0x0403 ID_PRODUCT_FTDI = 0x6011 ID_VENDOR_QCOM = 0x05C6 ID_PRODUCT_QCOM = 0x9302 ID_PRODUCT_BUGHOPPER_V1 = 0x6015 ID_VENDOR_BUGHOPPER_V2 = 0x2341 ID_PRODUCT_BUGHOPPER_V2 = 0xB001 ID_VENDOR_PIC32CX = 0x04D8 ID_PRODUCT_PIC32CX = 0x000A @classmethod def create_from_config(cls, config_file_path): return DummyBoard(config_file_path) @classmethod def known_boards(cls): # (idVendor, idProduct) -> human-readable board type. A pair may map # to more than one model (e.g. a pic32cx also enumerates as FTDI # 0403:6011); the label is the USB-level category, not the exact # model, which can only be resolved by querying the board. return { (cls.ID_VENDOR_FTDI, cls.ID_PRODUCT_BUGHOPPER_V1): "Bughopper V1", (cls.ID_VENDOR_FTDI, cls.ID_PRODUCT_FTDI): "FTDI", (cls.ID_VENDOR_QCOM, cls.ID_PRODUCT_QCOM): "PSOC", (cls.ID_VENDOR_BUGHOPPER_V2, cls.ID_PRODUCT_BUGHOPPER_V2): "Bughopper V2", (cls.ID_VENDOR_PIC32CX, cls.ID_PRODUCT_PIC32CX): "PIC32CX", } @staticmethod def _serial_ports(): """Yield connected serial ports in a cross-platform way. Uses ``pyserial``'s ``list_ports`` instead of ``pyudev`` so the tool works on macOS and Windows as well as Linux (``pyudev`` depends on ``libudev``, which only exists on Linux). """ yield from serial.tools.list_ports.comports() @classmethod def list_boards(cls): """Enumerate connected debug boards via their serial (tty) devices. Boards are discovered by walking the connected serial ports (the same place a board's serial port is found when driving it) and reading the ``serial_number`` / ``vid`` / ``pid`` reported by ``pyserial``. Using the serial port rather than the parent USB device ensures the serial number is available for all boards, including pic32cx. Returns a list of dicts with the board ``type``, USB ``serial`` number and ``vid``/``pid``, de-duplicated by serial (a board may expose more than one serial interface). """ known = cls.known_boards() boards = [] seen = set() for port in cls._serial_ports(): serial_short = port.serial_number if not serial_short or serial_short in seen: continue if port.vid is None or port.pid is None: continue vid = port.vid pid = port.pid board_type = known.get((vid, pid)) if board_type is None: continue seen.add(serial_short) boards.append( { "type": board_type, "serial": serial_short, "vid": vid, "pid": pid, } ) # The PIC32CX board also exposes an onboard FTDI FT4232H as a # UART/SPI bridge, which enumerates with the same VID/PID as a # standalone FTDI Alpaca board. It is not a separate debug board, so # drop it whenever a PIC32CX board is also present. if any(board["type"] == "PIC32CX" for board in boards): boards = [board for board in boards if board["type"] != "FTDI"] return boards @classmethod def create_board(cls, serial, tac_config_path): device = usb.core.find(serial_number=serial) if device: if ( device.idVendor == Board.ID_VENDOR_FTDI and device.idProduct == Board.ID_PRODUCT_BUGHOPPER_V1 ): logger.debug("Found Bughopper V1") return BughopperV1Board(device) if ( device.idProduct == Board.ID_PRODUCT_FTDI and device.idVendor == Board.ID_VENDOR_FTDI ): logger.debug("Found FTDI Board") return FtdiBoard(device, tac_config_path) if ( device.idProduct == Board.ID_PRODUCT_QCOM and device.idVendor == Board.ID_VENDOR_QCOM ): logger.debug("Found Psoc Board") return PsocBoard(device, tac_config_path) if ( device.idVendor == Board.ID_VENDOR_BUGHOPPER_V2 and device.idProduct == Board.ID_PRODUCT_BUGHOPPER_V2 ): logger.debug("Found Bughopper V2") if "hid" not in sys.modules: logger.error( "hid module not loaded. Check if the required packages are installed" ) sys.exit(1) return BughopperV2Board(device) # The PIC32CX board is driven purely over its CDC serial port and is not # visible to libusb (pyusb can't read its descriptors), so it is detected # via udev instead of usb.core.find. if Pic32cxBoard.detect(serial): logger.debug("Found PIC32CX Board") return Pic32cxBoard(serial, tac_config_path) def __init__(self): self.ports = {} self.pins = {} self.commands = {} self.quick_methods = {} self.usb_device = None dict.__init__( self, ports=self.ports, pins=self.pins, quick_methods=self.quick_methods ) def logComment(self, comment): print(comment) def delay(self, length): d = float(length / 1000) self.logComment(f"Sleeping for {d} seconds") sleep(d) def create_pins(self): raise NotImplementedError() def create_ports(self): raise NotImplementedError() @staticmethod def _sanitize_name(name): # Turn an arbitrary command name into a valid Python identifier. sanitized = re.sub(r"\W", "_", name) if not sanitized or not (sanitized[0].isalpha() or sanitized[0] == "_"): # identifiers may not start with a digit (e.g. "12vpoweroff") sanitized = f"_{sanitized}" if keyword.iskeyword(sanitized): sanitized = f"{sanitized}_" return sanitized @staticmethod def _check_script_indentation(script): """Require every statement in the script to be indented with one tab. TAC config scripts are written with tabs: a ``def`` at column 0 and its body one tab in. pytactl holds configs to that rather than accepting whatever whitespace happens to be there, so that a stray space-indented line is reported against the config instead of being quietly absorbed. ``pytactl convertconfigs`` normalises a config directory to tabs, and the configs shipped with pytactl have been through it. """ offenders = [] for number, line in enumerate(script.splitlines(), 1): if not line.strip(): # Blank lines are not statements, whatever they are made of. continue indent = line[: len(line) - len(line.lstrip())] if indent and indent != "\t": offenders.append(number) if offenders: raise ConfigScriptError( "Config script must indent statements with a single tab, but " "line(s) " + ", ".join(str(number) for number in offenders) + " use other whitespace. Run 'pytactl convertconfigs' on the " "config directory to normalise it." ) def _check_script_commands(self, script): """Warn about commands the script drives that no pin implements. Such a command becomes an AttributeError deep inside the config script the first time the board is asked to do something - typically when someone tries to power a board on. Saying so up front, naming the commands, points at the config instead. """ defined = set(re.findall(r"^def\s+(\w+)", script, re.MULTILINE)) # Driving a pin is " "; a bare "" line calls # another function. delay/logComment are the language's own statements. referenced = set(re.findall(r"^[ \t]+(\w+)[ \t]+\S", script, re.MULTILINE)) unbound = sorted( referenced - defined - set(self.commands) - {"delay", "logComment"} ) if unbound: logger.warning( "Config script drives %s, which no pin in this config defines; " "the functions using them will fail when called", ", ".join(repr(name) for name in unbound), ) def parse_script(self): if self.full_config: initial_script = self.full_config["script"] new_script = initial_script self._check_script_indentation(initial_script) # Some configs use command names that aren't valid Python # identifiers (e.g. "12vpoweroff" starts with a digit). The script # is converted to Python and exec'd, and create_pins later does # setattr(self, pin.command, ...), so such names must be renamed # consistently in both the script and the pin command they map to. rename_map = {} for pin in self.full_config.get("pins", []): command = pin.get("command") if command and ( not command.isidentifier() or keyword.iskeyword(command) ): if command not in rename_map: rename_map[command] = self._sanitize_name(command) pin["command"] = rename_map[command] for old_name, new_name in rename_map.items(): logger.debug(f"Renaming command {old_name} to {new_name}") name_re = re.compile(rf"\b{re.escape(old_name)}\b") new_script = name_re.sub(new_name, new_script) # replace variables with actual values variables = self.full_config.get("variables", []) for variable in variables: # create global variables var_name = variable.get("name") if var_name: var_re = re.compile(rf"\${var_name}") new_script = var_re.sub(variable["default_value"], new_script) # A "$name" left over is a variable the script uses but the config # never declares, so there is no value to substitute. Say which, # rather than letting it reach exec() as a syntax error: the value # is a board timing that only the config can supply. undeclared = sorted(set(re.findall(r"\$(\w+)", new_script))) if undeclared: raise ConfigScriptError( "Config script uses undeclared variable(s) " + ", ".join(f"${name}" for name in undeclared) + "; the config declares " + ( ", ".join(sorted(v["name"] for v in variables if v.get("name"))) or "none" ) ) # remove lines that start with // (// is a valid comment) new_script = "\n".join( line for line in new_script.splitlines() if not line.lstrip().startswith("//") ) # remove commented lines fix_comments = re.compile(r"\/\/.*") new_script = fix_comments.sub("\r", new_script) fix_comments = re.compile(r"\/\/.*\r") new_script = fix_comments.sub("\r", new_script) # Keep the script in its own language, with comments and variables # already resolved, for the command check further down: everything # below rewrites it into Python. alpaca_script = new_script # fix function definitions fix_functions = re.compile(r"\(\)[\s]?", re.MULTILINE) new_script = fix_functions.sub("(self):\n", new_script) fix_functions2 = re.compile(r"\(\)[\s]?\r", re.MULTILINE) new_script = fix_functions2.sub("(self):\r", new_script) # add brackets to function calls fix_no_parenthesis = re.compile( r"([A-Za-z0-9_]+)\s([0-9]+)\s?", re.MULTILINE ) new_script = fix_no_parenthesis.sub(r"self.\1(\2)\n", new_script) # fixes syntax of internal function calls fix_no_parenthesis_func = re.compile(r"\t([A-Za-z0-9_]+)$", re.MULTILINE) new_script = fix_no_parenthesis_func.sub(r"\tself.\1()", new_script) fix_no_parenthesis_empty = re.compile( r"self.([A-Za-z0-9_]+)\s?$", re.MULTILINE ) new_script = fix_no_parenthesis_empty.sub(r"self.\1()", new_script) fix_log_comment = re.compile( r"logComment\s([a-zA-Z0-9=_\ ]+)\s?$", re.MULTILINE ) new_script = fix_log_comment.sub(r'self.logComment("\1")', new_script) d = {} # nosemgrep: python.lang.security.audit.exec-detected.exec-detected exec(new_script, d) # create ports self.create_ports() # create pins self.create_pins() self._check_script_commands(alpaca_script) # iterate keys explicitly: this is an exec'd namespace and the # `.keys()` form is load-bearing here (see config-parsing history) for name in d.keys(): # noqa: SIM118 if not name.startswith("__"): logger.debug(f"Adding {name}") self.quick_methods.update({name: QuickMethod(self, name)}) method = MethodType(d.get(name), self) setattr(self, name, method) class DummyBoard(Board): def __init__(self, config_path): Board.__init__(self) self.config_path = config_path self.usb_device = lambda: None self.usb_device.serial_number = "123456" self.full_config = tacconfig.convert_file(self.config_path) self.parse_script() def create_ports(self): logger.debug("creating ports") # The pinout config names the platform explicitly, so the port layout # no longer has to be guessed from the file name. platform_type = self.full_config.get("platform_type", "") if platform_type in FTDI_PLATFORM_TYPES: for p in self.full_config.get("bus"): bus_name = p.get("bus") if p.get("bus_function") == 2: self.ports.update({bus_name: DummyPort(bus_name, "123456")}) if platform_type == "PSOC": self.ports.update({0: DummyPort("123456", None)}) def create_pins(self): logger.debug("creating pins") for config in self.full_config.get("pins"): pin = DummyPin(self, config) pin.setPort(self.ports.get(0)) logger.debug(f"Adding {pin.command}") self.pins.update({f"{pin.pin_number}": pin}) self.commands.update({f"{pin.command}": f"{pin.command}"}) setattr(self, pin.command, pin.set) class BughopperV1Board(Board): def __init__(self, usb_device): Board.__init__(self) self.usb_device = usb_device self.quick_methods.update({"powerOn": QuickMethod(self, "powerOn")}) self.quick_methods.update({"bootToEDL": QuickMethod(self, "bootToEDL")}) self.quick_methods.update({"powerOff": QuickMethod(self, "powerOff")}) self.quick_methods.update({"reset": QuickMethod(self, "reset")}) self.quick_methods.update( {"forceUsbcHostMode": QuickMethod(self, "forceUsbcHostMode")} ) self.quick_methods.update({"wakeUp": QuickMethod(self, "wakeUp")}) self.EDL_BIT = 0b00000001 self.POWER_DISABLE_BIT = 0b00000100 self.VOL_DOWN_BIT = 0b00001000 self.EDL_MASK = self.EDL_BIT << 4 self.POWER_DISABLE_MASK = self.POWER_DISABLE_BIT << 4 self.VOL_DOWN_MASK = self.VOL_DOWN_BIT << 4 def _ftdi_set_bitmode(self, bitmask): bmRequestType = usb.util.build_request_type( usb.util.CTRL_OUT, usb.util.CTRL_TYPE_VENDOR, usb.util.CTRL_RECIPIENT_DEVICE ) wValue = bitmask | (BITMODE_CBUS << 8) self.usb_device.ctrl_transfer(bmRequestType, SIO_SET_BITMODE_REQUEST, wValue) def powerOn(self): logger.debug("Power cycle to normal boot mode") self._ftdi_set_bitmode(self.POWER_DISABLE_MASK | self.POWER_DISABLE_BIT) sleep(PRE_RESET_DELAY) self._ftdi_set_bitmode( self.POWER_DISABLE_MASK | self.EDL_MASK | self.VOL_DOWN_MASK ) def bootToEDL(self): logger.debug("Power cycle to USB boot mode") self._ftdi_set_bitmode(self.POWER_DISABLE_MASK | self.POWER_DISABLE_BIT) sleep(PRE_RESET_DELAY) self._ftdi_set_bitmode(self.POWER_DISABLE_MASK | self.EDL_MASK | self.EDL_BIT) def reset(self): logger.debug("MPU reset pulse") self._ftdi_set_bitmode(self.POWER_DISABLE_MASK | self.POWER_DISABLE_BIT) sleep(PRE_RESET_DELAY) self._ftdi_set_bitmode( self.POWER_DISABLE_MASK | self.EDL_MASK | self.VOL_DOWN_MASK ) def powerOff(self): logger.debug("MPU poweroff") self._ftdi_set_bitmode(self.POWER_DISABLE_MASK | self.POWER_DISABLE_BIT) def wakeUp(self): logger.debug("VOL_DOWN pulse to wake from suspend") self._ftdi_set_bitmode( self.POWER_DISABLE_MASK | self.EDL_MASK | self.VOL_DOWN_MASK | self.VOL_DOWN_BIT ) sleep(WAKE_PULSE_DELAY) self._ftdi_set_bitmode( self.POWER_DISABLE_MASK | self.EDL_MASK | self.VOL_DOWN_MASK ) def forceUsbcHostMode(self): logger.debug("Forcing host mode") self._ftdi_set_bitmode( self.POWER_DISABLE_MASK | self.VOL_DOWN_MASK | self.POWER_DISABLE_BIT | self.VOL_DOWN_BIT ) sleep(PRE_RESET_DELAY) self._ftdi_set_bitmode( self.POWER_DISABLE_MASK | self.EDL_MASK | self.VOL_DOWN_MASK | self.VOL_DOWN_BIT ) class BughopperV2Board(Board): def __init__(self, usb_device): Board.__init__(self) self.usb_device = hid.Device(usb_device.idVendor, usb_device.idProduct) self.usb_device.serial_number = self.usb_device.serial self.quick_methods.update({"powerOn": QuickMethod(self, "powerOn")}) self.quick_methods.update({"bootToEDL": QuickMethod(self, "bootToEDL")}) self.quick_methods.update({"powerOff": QuickMethod(self, "powerOff")}) self.quick_methods.update({"reset": QuickMethod(self, "reset")}) self.quick_methods.update( {"forceUsbcHostMode": QuickMethod(self, "forceUsbcHostMode")} ) self.quick_methods.update({"wakeUp": QuickMethod(self, "wakeUp")}) self.CMD_GPIO = 0x1 self.EDL_BIT = 0x1 self.POWER_DISABLE_BIT = 0x4 self.VOL_DOWN_BIT = 0x8 def _hid_set_bitmode(self, command, gpio_value, mask=0xF): # The leading 0x00 is the HID report-ID placeholder for this unnumbered # RawHID report. hidapi always consumes byte 0 of a write as the report # ID: Linux/hidraw tolerates its absence, but on Windows the command # byte would be swallowed as a (non-existent) report ID and stripped, # so the firmware never sees the GPIO command. Prepending 0x00 keeps the # [command, gpio_value, mask] payload intact on every platform. self.usb_device.write(bytes([0x00, command, gpio_value, mask])) def powerOn(self): logger.debug("Power cycle to normal boot mode") self._hid_set_bitmode( self.CMD_GPIO, self.POWER_DISABLE_BIT, self.POWER_DISABLE_BIT ) sleep(PRE_RESET_DELAY) self._hid_set_bitmode( self.CMD_GPIO, 0x0, self.POWER_DISABLE_BIT | self.EDL_BIT | self.VOL_DOWN_BIT, ) def bootToEDL(self): logger.debug("Power cycle to USB boot mode") self._hid_set_bitmode( self.CMD_GPIO, self.POWER_DISABLE_BIT, self.POWER_DISABLE_BIT ) sleep(PRE_RESET_DELAY) self._hid_set_bitmode( self.CMD_GPIO, self.EDL_BIT, self.EDL_BIT | self.POWER_DISABLE_BIT ) def reset(self): logger.debug("MPU reset pulse") self._hid_set_bitmode( self.CMD_GPIO, self.POWER_DISABLE_BIT, self.POWER_DISABLE_BIT ) sleep(PRE_RESET_DELAY) self._hid_set_bitmode( self.CMD_GPIO, 0x0, self.POWER_DISABLE_BIT | self.EDL_BIT | self.VOL_DOWN_BIT, ) def powerOff(self): logger.debug("MPU poweroff") self._hid_set_bitmode( self.CMD_GPIO, self.POWER_DISABLE_BIT, self.POWER_DISABLE_BIT ) def wakeUp(self): logger.debug("VOL_DOWN pulse to wake from suspend") self._hid_set_bitmode(self.CMD_GPIO, self.VOL_DOWN_BIT, self.VOL_DOWN_BIT) sleep(WAKE_PULSE_DELAY) self._hid_set_bitmode(self.CMD_GPIO, 0x0, self.VOL_DOWN_BIT) def forceUsbcHostMode(self): logger.debug("Forcing host mode") self._hid_set_bitmode( self.CMD_GPIO, self.POWER_DISABLE_BIT | self.VOL_DOWN_BIT, self.POWER_DISABLE_BIT | self.VOL_DOWN_BIT, ) sleep(PRE_RESET_DELAY) self._hid_set_bitmode( self.CMD_GPIO, self.VOL_DOWN_BIT, self.POWER_DISABLE_BIT | self.VOL_DOWN_BIT | self.EDL_BIT, ) class FtdiBoard(Board): def __init__(self, usb_device, tac_config_path): Board.__init__(self) self.usb_device = usb_device # Default config for FTDI Alpaca-Lite, used when the board's USB # descriptor matches no catalog entry. conf = default_config_file(tac_config_path) f = open(os.path.join(tac_config_path, "devicelist.json")) device_list = json.loads(f.read()) f.close() catalog = device_list.get("catalog") conf_dict = next( (x for x in catalog if x.get("usb_descriptor") == self.usb_device.product), None, ) if conf_dict: conf = os.path.join( tac_config_path, os.path.basename(conf_dict.get("configPath")) ) if conf is None: logger.error("No matching FTDI config found") sys.exit(1) self.full_config = tacconfig.convert_file(conf) self.parse_script() def create_ports(self): for p in self.full_config.get("bus"): bus_name = p.get("bus") if p.get("bus_function") == 2: self.ports.update( {bus_name: FtdiPort(bus_name, self.usb_device.serial_number)} ) def create_pins(self): for p in self.full_config.get("pins"): pin = FtdiPin(self, p) pin.setPort(self.ports.get(pin.bus)) logger.debug(f"Adding {pin.command}") self.pins.update({f"{pin.bus}{pin.pin_number}": pin}) self.commands.update({f"{pin.command}": f"{pin.command}"}) setattr(self, pin.command, pin.set) class PsocBoard(Board): def __init__(self, usb_device, tac_config_path): Board.__init__(self) self.usb_device = usb_device conf = None f = open(os.path.join(tac_config_path, "devicelist.json")) device_list = json.loads(f.read()) f.close() catalog = device_list.get("catalog") self.board_id = self.__get_board_id() conf_dict = next( (x for x in catalog if x.get("platform_id") == self.board_id), None ) if conf_dict: conf = os.path.join( tac_config_path, os.path.basename(conf_dict.get("configPath")) ) if conf is None: logger.error("No matching PSOC config found") sys.exit(1) self.full_config = tacconfig.convert_file(conf) self.parse_script() self.quick_methods.update({"devicePowerOn": QuickMethod(self, "devicePowerOn")}) self.quick_methods.update( {"devicePowerOff": QuickMethod(self, "devicePowerOff")} ) self.quick_methods.update( {"usbDevicePowerOn": QuickMethod(self, "usbDevicePowerOn")} ) self.quick_methods.update( {"usbDevicePowerOff": QuickMethod(self, "usbDevicePowerOff")} ) def devicePower(self, value): logger.debug(f"Calling devicePower {value}") if value: self.ports[0].call_method("devicePower", "on") else: self.ports[0].call_method("devicePower", "off") def usbDevicePower(self, value): logger.debug(f"Calling usbDevicePower {value}") if value: self.ports[0].call_method("usbDevicePower", "on") else: self.ports[0].call_method("usbDevicePower", "off") def devicePowerOn(self): self.devicePower(True) def devicePowerOff(self): self.devicePower(False) def usbDevicePowerOn(self): self.usbDevicePower(True) def usbDevicePowerOff(self): self.usbDevicePower(False) def __get_board_id(self): # connect to serial and call "getboardid" serial_port = None for port in serial.tools.list_ports.comports(): if port.serial_number == self.usb_device.serial_number: serial_port = port.device break logger.info(f"Opening {serial_port}") expect_connection = None connection = serial.Serial() connection.baudrate = 115200 connection.port = serial_port try: connection.open() except serial.SerialException as e: logger.error("Serial Exception") logger.error(e) sys.exit(1) expect_connection = fdpexpect.fdspawn(connection) if not expect_connection.isalive(): logger.error("Expect connection not created") sys.exit(1) expect_connection.send("\r") expect_connection.expect("CMD") expect_connection.send("getboardid\r") expect_connection.expect("ok") ret_value = expect_connection.before expect_connection.close() # find returned value r = re.search(r"\d+", ret_value.decode()) if r: return int(r.group(0)) return None def create_ports(self): self.ports.update({0: PsocPort(self.usb_device.serial_number)}) def create_pins(self): for config in self.full_config.get("pins"): pin = PsocPin(self, config) pin.setPort(self.ports.get(0)) logger.debug(f"Adding {pin.command}") self.pins.update({f"{pin.pin_number}": pin}) self.commands.update({f"{pin.command}": f"{pin.command}"}) setattr(self, pin.command, pin.set) class Pic32cxBoard(Board): @staticmethod def detect(serial_number): """Return True if a PIC32CX tty matching ``serial_number`` is present. The PIC32CX board is not visible to libusb, so it is discovered via the serial port by matching the serial number together with its USB VID/PID. """ for port in serial.tools.list_ports.comports(): if port.serial_number != serial_number: continue if port.vid is None or port.pid is None: continue if ( port.vid == Board.ID_VENDOR_PIC32CX and port.pid == Board.ID_PRODUCT_PIC32CX ): return True return False def __init__(self, serial, tac_config_path): Board.__init__(self) self.usb_device = lambda: None self.usb_device.serial_number = serial conf = None f = open(os.path.join(tac_config_path, "devicelist.json")) device_list = json.loads(f.read()) f.close() catalog = device_list.get("catalog") # The platform is identified by the part of the serial number before # "XX", which matches the usb_descriptor field in devicelist.json. self.usb_descriptor = serial.split("XX")[0] conf_dict = next( (x for x in catalog if x.get("usb_descriptor") == self.usb_descriptor), None, ) if conf_dict: conf = os.path.join( tac_config_path, os.path.basename(conf_dict.get("configPath")) ) if conf is None: logger.error( "No matching PIC32CX config found for usb_descriptor %r " "(serial %s). Known usb_descriptors: %s", self.usb_descriptor, serial, ", ".join( sorted( x.get("usb_descriptor") for x in catalog if x.get("usb_descriptor") ) ), ) sys.exit(1) self.full_config = tacconfig.convert_file(conf) self.parse_script() def create_ports(self): self.ports.update({0: Pic32cxPort(self.usb_device.serial_number)}) def create_pins(self): for config in self.full_config.get("pins"): pin = Pic32cxPin(self, config) pin.setPort(self.ports.get(0)) logger.debug(f"Adding {pin.command}") self.pins.update({f"{pin.pin_number}": pin}) self.commands.update({f"{pin.command}": f"{pin.command}"}) setattr(self, pin.command, pin.set) class QuickMethod(dict): def __init__(self, board, name): self.name = name self.board = board dict.__init__(self, name=self.name, board=self.board.usb_device.serial_number) def call(self): try: getattr(self.board, self.name)() except Exception as e: logger.error(e) raise TACException return {} class Pin(dict): def __init__(self, board, config): self.board = board self.bus = config.get("bus") self.command = config.get("command") self.initial_value = config.get("initial_value") self.value = self.initial_value self.input = config.get("input") self.inverted = config.get("inverted") self.pin_number = int(config.get("pin_number")) self.help_hint = config.get("help_hint") self.port = None dict.__init__( self, bus=self.bus, command=self.command, initial_value=self.initial_value, value=self.value, input=self.input, inverted=self.inverted, pin_number=self.pin_number, help_hint=self.help_hint, port=self.port, ) def set(self, value): self.value = value super().__setitem__("value", self.value) def initialize(self): raise NotImplementedError() def setPort(self, port): self.port = port super().__setitem__("port", self.port) class DummyPin(Pin): def initialize(self): logger.info(f"Initializing pin: {self.bus} {self.pin_number}") class FtdiPin(Pin): def __init__(self, board, config): Pin.__init__(self, board, config) self.pin_number_mask = 1 << self.pin_number def set(self, value): super().set(value) if not self.port: logger.warning(f"No port set for pin {self.bus}{self.pin_number}") return logger.debug(f"Port {self.bus} status: 0x{self.port.status:02X}") logger.debug(f"Setting {self.bus}{self.pin_number} to {value}") logger.debug(f"Mask: 0x{self.pin_number_mask:02X}") if self.value: self.port.write(self.port.status | self.pin_number_mask) else: self.port.write(self.port.status & ~self.pin_number_mask) def initialize(self): self.set(int(self.initial_value)) def setPort(self, port): super().setPort(port) self.initialize() class PsocPin(Pin): def __init__(self, board, config): Pin.__init__(self, board, config) def set(self, value): lcl_value = None try: lcl_value = int(value) except ValueError: logger.error("Value has to be int") logger.error(f"Received {value}") return super().set(lcl_value) if not self.port: logger.warning(f"No port set for pin {self.pin_number}") return logger.debug(f"Setting {self.pin_number} to {lcl_value}") self.port.write(lcl_value, self.pin_number) def initialize(self): self.set(int(self.initial_value)) def setPort(self, port): super().setPort(port) self.initialize() class Pic32cxPin(Pin): def __init__(self, board, config): Pin.__init__(self, board, config) def set(self, value): lcl_value = None try: lcl_value = int(value) except ValueError: logger.error("Value has to be int") logger.error(f"Received {value}") return super().set(lcl_value) if not self.port: logger.warning(f"No port set for pin {self.pin_number}") return logger.debug(f"Setting {self.pin_number} to {lcl_value}") self.port.write(lcl_value, self.pin_number) def initialize(self): # PIC32CX configs define no initial pin value, and the reference TAC # tool does not drive any pins on connect. Leave pins untouched until # explicitly commanded so connecting does not actuate the board. pass def setPort(self, port): super().setPort(port) class Port(dict): def __init__(self, bus, serial): self.serial = serial self.bus = bus dict.__init__(self, serial=self.serial, bus=self.bus) def write(self, value, pin=None): raise NotImplementedError() def close(self): raise NotImplementedError() class DummyPort(Port): def write(self, value, pin=None): logger.info(f"Writing to port {self.bus} {self.serial}") def close(self): logger.info(f"Closing port {self.bus}") class PsocPort(Port): def __init__(self, serialid): Port.__init__(self, None, serialid) self.serial_port = None for port in serial.tools.list_ports.comports(): if port.serial_number == serialid: self.serial_port = port.device break self.expect_connection = None self.connection = serial.Serial() self.connection.baudrate = 115200 self.connection.port = self.serial_port try: self.connection.open() except serial.SerialException as e: logger.error("Serial Exception") logger.error(e) sys.exit(1) self.expect_connection = fdpexpect.fdspawn(self.connection) if not self.expect_connection.isalive(): logger.error("Expect connection not created") sys.exit(1) def close(self): if self.connection and self.connection.is_open: self.connection.close() def call_method(self, method, value): logger.debug(f"Calling {method} {value}") if self.expect_connection and self.expect_connection.isalive(): self.expect_connection.send("\r") self.expect_connection.expect("CMD") message = f"{method} {value}\r" self.expect_connection.send(message) self.expect_connection.expect("ok") else: logger.error("No expect connection") sys.exit(1) def write(self, value, pin=None): if not pin: logger.warning("No pin selected") return if self.expect_connection and self.expect_connection.isalive(): self.expect_connection.send("\r") self.expect_connection.expect("CMD") message = f"pin {value} {pin}\r" self.expect_connection.send(message) self.expect_connection.expect("ok") else: logger.error("No expect connection") sys.exit(1) class Pic32cxPort(Port): def __init__(self, serialid): Port.__init__(self, None, serialid) self.serial_port = None for port in serial.tools.list_ports.comports(): if port.serial_number == serialid: self.serial_port = port.device break if self.serial_port is None: logger.error(f"No serial port found for {serialid}") sys.exit(1) self.connection = serial.Serial() self.connection.baudrate = 115200 self.connection.timeout = 0.5 self.connection.port = self.serial_port try: self.connection.open() except serial.SerialException as e: logger.error("Serial Exception") logger.error(e) sys.exit(1) # Clear any pending data in the firmware's command buffer. self.__send("echo 1") def __send(self, message): logger.debug(f"Sending: {message}") self.connection.reset_input_buffer() self.connection.write(f"{message}\n".encode()) self.connection.flush() # Drain the firmware's reply so it doesn't leak into the next command. response = self.connection.read_until().decode(errors="replace") logger.debug(f"Response: {response!r}") def write(self, value, pin=None): if pin is None: logger.warning("No pin selected") return # The firmware expects 'port 0' pins to be zero-padded to three digits. pin_str = str(pin) if len(pin_str) < 3: pin_str = "0" + pin_str self.__send(f"CONF:DIG:ON {int(bool(value))} (@{pin_str})") def close(self): if self.connection and self.connection.is_open: self.connection.close() class FtdiPort(Port): def __init__(self, bus, serial, direction=0xFF): Port.__init__(self, bus, serial) self.direction = direction self.port = ord(self.bus) - ord("A") + 1 self.url = f"ftdi://::{self.serial}/{self.port}" self.pins = {} self.status = 0x0 self.gpio = GpioAsyncController() self.gpio.configure(self.url, direction=self.direction) def write(self, value, pin=None): self.status = value logger.debug(f"Port {self.bus} value: 0x{self.status:02X}") self.gpio.write(self.status) def close(self): logger.debug(f"Closing port {self.bus}") self.gpio.close() pytactl-3.2/pytactl/installconfigs.py000066400000000000000000000173541526550266300201330ustar00rootroot00000000000000# Copyright (c) 2026 Qualcomm Technologies, Inc. and/or its subsidiaries. # SPDX-License-Identifier: BSD-3-Clause import logging import os import shutil import sys import tempfile from urllib.parse import urlparse import requests from . import ( BUNDLED_DEFAULT_CONFIG_FILENAME, DEFAULT_CONFIG_FILENAME, DEFAULT_CONFIG_REPOSITORY, INSTALLED_TAC_CONFIG_PATH, PACKAGE_TAC_CONFIG_PATH, tacconfig, ) logger = logging.getLogger() # Default subdirectory in the config repository holding the config files + # devicelist.json, and the default git ref to fetch them from. DEFAULT_REPOSITORY_PATH = "configurations" DEFAULT_REF = "HEAD" # The synthesized FTDI Alpaca-Lite config shipped with the package. It has no # upstream config file, so we copy it into the install directory as the default. _BUNDLED_DEFAULT = os.path.join( PACKAGE_TAC_CONFIG_PATH, BUNDLED_DEFAULT_CONFIG_FILENAME ) def _parse_owner_repo(repository_url): """Extract (owner, repo) from a GitHub repository URL.""" path = urlparse(repository_url).path.strip("/") if path.endswith(".git"): path = path[:-4] parts = path.split("/") if len(parts) < 2: raise ValueError( f"Cannot parse owner/repo from repository URL: {repository_url}" ) return parts[0], parts[1] def _list_config_files(owner, repo, repository_path, ref): """Return [(name, download_url)] for every config file and devicelist.json. Both config formats are fetched: legacy combined ``.tcnf`` files and, once upstream splits them, the ``.pinout.json`` files plus their slim ``.tcnf`` overlays. `tacconfig.convert_directory` reduces whichever arrives to the pinout files pytactl loads. """ api_url = f"https://api.github.com/repos/{owner}/{repo}/contents/{repository_path}" resp = requests.get(api_url, params={"ref": ref}, timeout=30) resp.raise_for_status() files = [] for entry in resp.json(): name = entry.get("name", "") if entry.get("type") == "file" and ( name.endswith(".tcnf") or name.endswith(tacconfig.PINOUT_EXTENSION) or name == "devicelist.json" ): files.append((name, entry["download_url"])) return files def _resolve_commit(owner, repo, ref): """Resolve a git ref to the commit SHA it points at, or ``None``. Converted configs are annotated with the revision they came from, and a ref like "HEAD" or "main" moves; recording the SHA it resolved to at import time is what makes the annotation worth having. """ api_url = f"https://api.github.com/repos/{owner}/{repo}/commits/{ref}" try: resp = requests.get(api_url, timeout=30) resp.raise_for_status() return resp.json().get("sha") except (requests.RequestException, ValueError) as error: logger.warning("Could not resolve %s to a commit: %s", ref, error) return None def _download(url, dest): resp = requests.get(url, timeout=60) resp.raise_for_status() with open(dest, "wb") as f: f.write(resp.content) def install_configs( config_repository=None, local_path=None, ref=None, repository_path=None, annotate=True, ): """Download TAC config files, convert them and install them into ``local_path``. Fetches every config file and ``devicelist.json`` from ``repository_path`` (at git ``ref``) of ``config_repository``, converts each one into the shared pinout format pytactl loads (see :mod:`pytactl.tacconfig`), copies the bundled FTDI Alpaca-Lite config in as the default, and rewrites the ``configPath`` entries in ``devicelist.json`` to match. Each installed config is annotated with the repository, ref and commit it came from, unless ``annotate`` is false. Deprecated: the configs bundled with pytactl are synced from upstream with the fixes pytactl needs, which a raw upstream install lacks. """ logger.warning( "'installconfigs' is deprecated and will be removed in a future release. " "The configs bundled with pytactl are synced from upstream and carry " "fixes upstream does not; the configs installed here replace them for " "every command that is not given --tac-config-path. To use a config set " "of your own, convert it with 'convertconfigs' and pass --tac-config-path." ) config_repository = config_repository or DEFAULT_CONFIG_REPOSITORY local_path = local_path or INSTALLED_TAC_CONFIG_PATH ref = ref or DEFAULT_REF repository_path = repository_path or DEFAULT_REPOSITORY_PATH owner, repo = _parse_owner_repo(config_repository) os.makedirs(local_path, exist_ok=True) logger.info( "Fetching config list from %s/%s/%s at %s", owner, repo, repository_path, ref, ) files = _list_config_files(owner, repo, repository_path, ref) if not files: logger.error( "No config files or devicelist.json found in %s", config_repository ) sys.exit(1) source_info = None if annotate: source_info = {"repository": config_repository, "ref": ref} commit = _resolve_commit(owner, repo, ref) if commit: source_info["commit"] = commit logger.info("Importing %s at %s", ref, commit) source_info["path"] = repository_path with tempfile.TemporaryDirectory(prefix="pytactl-configs-") as download_dir: for name, url in files: logger.info("Downloading %s", name) _download(url, os.path.join(download_dir, name)) result = tacconfig.convert_directory( download_dir, local_path, default_filename=DEFAULT_CONFIG_FILENAME, source_info=source_info, annotate=annotate, ) if result["failed"]: for name, error in result["failed"]: logger.warning("Skipped %s: %s", name, error) if not result["device_list"]: logger.warning("devicelist.json not found in repository; not installed") shutil.copyfile(_BUNDLED_DEFAULT, os.path.join(local_path, DEFAULT_CONFIG_FILENAME)) logger.info("Installed %s", DEFAULT_CONFIG_FILENAME) print(f"Installed {len(result['converted']) + 1} TAC config files to {local_path}") def convert_configs( source, destination=None, write_overlay=False, dry_run=False, annotate=True, default_config=None, ): """Convert a directory of TAC config files into the shared pinout format. Backs the "convertconfigs" subcommand: the same conversion "installconfigs" applies to what it downloads, run against a checkout (or any directory) the caller already has. When ``source`` is inside a git checkout, each converted config is annotated with that repository and the commit checked out; ``annotate=False`` skips it. ``default_config`` names the file that ``devicelist.json`` entries with no config of their own point at, for a destination that holds the FTDI Alpaca-Lite default under a name other than DEFAULT_CONFIG_FILENAME. """ if not os.path.isdir(source): logger.error("Source directory does not exist: %s", source) sys.exit(1) destination = destination or source result = tacconfig.convert_directory( source, destination, default_filename=default_config or DEFAULT_CONFIG_FILENAME, write_overlay=write_overlay, dry_run=dry_run, annotate=annotate, ) for name, error in result["failed"]: logger.warning("Skipped %s: %s", name, error) verb = "Would convert" if dry_run else "Converted" print(f"{verb} {len(result['converted'])} TAC config files into {destination}") if result["failed"]: print(f"{len(result['failed'])} config file(s) could not be converted") sys.exit(1) pytactl-3.2/pytactl/service.py000077500000000000000000000073011526550266300165460ustar00rootroot00000000000000#!/usr/bin/env python3 # Copyright (c)i 2025-2026 Qualcomm Technologies, Inc. and/or its subsidiaries. # SPDX-License-Identifier: BSD-3-Clause import logging from flask import Flask from flask_restful import Api, Resource, reqparse from werkzeug.exceptions import BadRequest from werkzeug.serving import run_simple from .debugboard import Board, TACException app = Flask(__name__) api = Api(app) logger = logging.getLogger() boards = {} rparser = reqparse.RequestParser() rparser.add_argument( "value", type=int, help="1 for setting pin HIGH, 0 for setting pin LOW" ) class BoardView(Resource): def get(self, boardid): return boards.get(boardid, {}) class BoardList(Resource): def get(self): return boards class QuickMethodView(Resource): def get(self, boardid, name): b = boards.get(boardid, {}) if b: return b.quick_methods.get(name, {}) return {} def put(self, boardid, name): b = boards.get(boardid, {}) if b: try: getattr(b, name)() except Exception: raise TACException return b.pins class QuickMethodList(Resource): def get(self, boardid): b = boards.get(boardid, {}) if b: return b.quick_methods return {} class CommandView(Resource): def get(self, boardid, name): b = boards.get(boardid, {}) if b: return b.commands.get(name, {}) return {} def put(self, boardid, name): args = rparser.parse_args() value = args.get("value") if value is None: raise BadRequest("insufficient parameters") b = boards.get(boardid, {}) if b: try: c = getattr(b, name) if c: c(value) except Exception: raise TACException return b.pins class CommandList(Resource): def get(self, boardid): b = boards.get(boardid, {}) if b: return b.commands return {} class PinView(Resource): def get(self, boardid, pinid): b = boards.get(boardid, {}) if b: return b.pins.get(pinid, {}) return {} def put(self, boardid, pinid): args = rparser.parse_args() value = args.get("value") if value is None: raise BadRequest("insufficient parameters") b = boards.get(boardid, {}) if b: p = b.pins.get(pinid) p.set(value) return b.pins.get(pinid) class PinList(Resource): def get(self, boardid): b = boards.get(boardid, {}) if b: return b.pins return {} class PortView(Resource): def get(self, boardid, portid): b = boards.get(boardid, {}) if b: return b.ports.get(portid, {}) return {} class PortList(Resource): def get(self, boardid): b = boards.get(boardid, {}) if b: return b.ports return {} api.add_resource(BoardList, "/") api.add_resource(BoardView, "/") api.add_resource(PinView, "//pin/") api.add_resource(PinList, "//pin") api.add_resource(QuickMethodView, "//quick/") api.add_resource(QuickMethodList, "//quick") api.add_resource(PortView, "//port/") api.add_resource(PortList, "//port") api.add_resource(CommandView, "//command/") api.add_resource(CommandList, "//command") def run_service(serials, tac_config_path, hostname="0.0.0.0", port=5000): for serial in serials: boards.update({serial: Board.create_board(serial, tac_config_path)}) run_simple(hostname, port, app) pytactl-3.2/pytactl/shell.py000066400000000000000000000053211526550266300162120ustar00rootroot00000000000000# Copyright (c)i 2025-2026 Qualcomm Technologies, Inc. and/or its subsidiaries. # SPDX-License-Identifier: BSD-3-Clause import logging import sys from cmd import Cmd from .debugboard import Board, ConfigScriptError logger = logging.getLogger() def make_h(name, comment=None): def h(cls, *args): print("Set GPIO value to HIGH (1) or LOW (0)") print("When called without parameters, GPIO is set to LOW") if comment: print(comment) return h def make_f(quick_method): def f(cls, *args): quick_method.call() return f class AlpacaCmd(Cmd): def do_quit(self, line): print("Quitting") return True do_EOF = do_quit def _create_board(serial, config_file_path, tac_config_path): board = None try: if serial: board = Board.create_board(serial, tac_config_path) if config_file_path: board = Board.create_from_config(config_file_path) except ConfigScriptError as error: # A defect in the config file itself, which the message describes and # the user can act on. A traceback would only bury it. logger.error("%s", error) sys.exit(1) if board is None: logger.error(f"Failed to create board with serial {serial}, board not found") sys.exit(1) return board def run_oneshot( command, serial=None, config_file_path=None, tac_config_path=None, value=None ): board = _create_board(serial, config_file_path, tac_config_path) func = getattr(board, command, None) if not callable(func): available = sorted([*board.quick_methods, *board.commands]) logger.error( f"Unknown command '{command}'. Available commands: {', '.join(available)}" ) sys.exit(1) if value is None: func() else: try: value = int(value) except ValueError: logger.error(f"Command '{command}' value must be an integer, got '{value}'") sys.exit(1) func(value) def run_shell(serial=None, config_file_path=None, tac_config_path=None): board = _create_board(serial, config_file_path, tac_config_path) for pin in board.pins.values(): method_name = f"do_{pin.command}" help_name = f"help_{pin.command}" logger.debug(f"Adding {method_name}") method = pin.set help_f = make_h(pin.command, pin.get("help_hint")) setattr(AlpacaCmd, method_name, method) setattr(AlpacaCmd, help_name, help_f) for name, method in board.quick_methods.items(): method_name = f"do_{name}" logger.debug(f"Adding {method_name}") setattr(AlpacaCmd, method_name, make_f(method)) cmd = AlpacaCmd() cmd.cmdloop() pytactl-3.2/pytactl/tac_configs/000077500000000000000000000000001526550266300170075ustar00rootroot00000000000000pytactl-3.2/pytactl/tac_configs/README.md000066400000000000000000000076021526550266300202730ustar00rootroot00000000000000# Bundled TAC configuration files The board configuration files in this directory are vendored from [qcom-test-automation-controller](https://github.com/qualcomm/qcom-test-automation-controller), which is the upstream source of truth for them, and converted to the shared pinout format (see `pytactl/tacconfig.py` and *Config file format* in the top-level README). | | | |---|---| | Source | `https://github.com/qualcomm/qcom-test-automation-controller` | | Directory | `configurations/` | | Commit | per file, in its `source` annotation (initial import: `757cc972c88e4a1098881b2bc73f3d53eac286be`, `main`, 2026-08-21) | | Licence | BSD-3-Clause, the same as pytactl | Each config records that provenance itself, in a `source` object right below the format envelope, so a file stays traceable away from this directory: ```json { "$schema": "https://qualcomm.github.io/tac/schemas/pinout-1.0.json", "format": "tac-pinout", "schema_version": "1.0", "source": { "repository": "https://github.com/qualcomm/qcom-test-automation-controller.git", "commit": "757cc972c88e4a1098881b2bc73f3d53eac286be", "path": "configurations", "file": "TAC_FTDI_15.tcnf" }, ... } ``` `TAC_FTDI_13.pinout.json` is the exception: it has no upstream config file, so its annotation points at the code that defines it instead. The FTDI Alpaca-Lite default is generated by `FTDIPlatformConfiguration.cpp` in the QTAC sources, and this is that configuration written out. `pytactl installconfigs` copies it into the directory it populates as `default.pinout.json`; here it keeps its own name, and `devicelist.json` entries with no config of their own point straight at it. Scripts in these configs indent statements with a single tab, which is what the parser requires. `convertconfigs` re-indents on import and logs each file it touches; three upstream configs (`TAC_FTDI_51`, `TAC_FTDI_52`, `TAC_FTDI_77`) indent two lines each with spaces and are corrected on the way in. If a refresh reports re-indentation for a config not on that list, it is worth raising upstream. ## Syncing with upstream The *Upstream config sync* workflow (`.github/workflows/upstream-config-sync.yml`) runs weekly, on Mondays. It converts the upstream configs and compares them with this directory file by file, ignoring the `source` annotation, and opens a pull request (from the `upstream-config-sync` branch) applying whatever changed. Each file it updates is stamped with the upstream commit it now comes from, so the configs here need not all name the same commit. If the test suite fails against the synced configs, the pull request is opened as a draft with the failing tests listed, and the run is marked failed. Upstream changes that should stay out of pytactl are listed in `scripts/known-config-differences.json`, each with a fingerprint of the upstream file it was reviewed against. A listed difference does not trigger a pull request until upstream changes that file again. Entries in the upstream `devicelist.json` for configs not vendored here, held back ones included, are left out of the catalog. The same comparison runs locally: ```sh git clone https://github.com/qualcomm/qcom-test-automation-controller.git /tmp/qtac python scripts/sync_upstream_configs.py /tmp/qtac # report; exit 1 if anything new python scripts/sync_upstream_configs.py /tmp/qtac --apply # take the new differences python scripts/sync_upstream_configs.py /tmp/qtac --update-known # hold back all current ones ``` To hold back a difference the workflow has proposed, revert that file on the pull request branch, run `--update-known` and push the updated known-differences file (add a `note` to the entry saying why). `TAC_FTDI_13.pinout.json` is not in the upstream set and is never compared or touched; re-stamp it by hand if the generated default changes. Do not edit these files by hand: fixes belong upstream, or they are lost at the next refresh. pytactl-3.2/pytactl/tac_configs/TAC_FTDI_13.pinout.json000066400000000000000000000164511526550266300227460ustar00rootroot00000000000000{ "$schema": "https://qualcomm.github.io/tac/schemas/pinout-1.0.json", "format": "tac-pinout", "schema_version": "1.0", "source": { "repository": "https://github.com/qualcomm/qcom-test-automation-controller.git", "commit": "757cc972c88e4a1098881b2bc73f3d53eac286be", "path": "src/libraries/qcommon-console", "file": "FTDIPlatformConfiguration.cpp" }, "bus": [ { "bus": "A", "bus_function": 1, "chip_index": 0 }, { "bus": "B", "bus_function": 1, "chip_index": 0 }, { "bus": "C", "bus_function": 2, "chip_index": 0 }, { "bus": "D", "bus_function": 2, "chip_index": 0 } ], "chip_count": 1, "description": "Default FTDI configuration", "name": "Default FTDI configurationi", "platform_id": 13, "platform_type": "FTDI", "reset_enabled": false, "script": "def powerOffTheDevice() \n\tlogComment ====== powerOffTheDevice sequence start ======\n\tbattery 1\n\tusb0 1\n\tusb1 1\n\tlogComment ====== powerOffTheDevice sequence finish ======\n\ndef powerOnTheDevice()\n\tlogComment ====== powerOnTheDevice sequence start ======\n\tdelay 500\n\tbattery 0\n\tdelay 900\n\tusb0 0\n\tusb1 0\n\tdelay 30\n\tlogComment ====== powerOnTheDevice sequence finish ======\n\ndef powerOff()\n\tlogComment ====== powerOff start ======\n\tpowerOffTheDevice\n\tpkey 0\n\tvolup 0\n\tvoldn 0\n\tpedl 0\n\tlogComment ====== powerOff finish ======\n\ndef powerOn()\n\tlogComment ====== powerOn start ======\n\tpowerOff\n\tpowerOnTheDevice\n\tpkey 1\n\tdelay 800\n\tpkey 0\n\tlogComment ====== powerOn finish ======\n\ndef bootToEDL()\n\tlogComment ====== bootToEDL start ======\n\tpowerOffTheDevice\n\tpkey 0\n\tvolup 0\n\tvoldn 0\n\tpedl 1\n\tpowerOnTheDevice\n\tpkey 1\n\tdelay $edl\n\tpkey 0\n\tpedl 0\n\tlogComment ====== bootToEDL finish ======\n\ndef bootToSecondaryEDL()\n\tlogComment ====== bootToSecondaryEDL start ======\n\tpowerOffTheDevice\n\tpkey 0\n\tvolup 0\n\tvoldn 0\n\tsedl 1\n\tpowerOnTheDevice\n\tpkey 1\n\tdelay 800\n\tpkey 0\n\tdelay 1300\n\tsedl 0\n\tlogComment ====== bootToSecondaryEDL finish ======\n\ndef bootToUEFI()\n\tlogComment ====== bootToUEFIMenu start ======\n\tpowerOffTheDevice\n\t// Put buttons in a set state\n\tpkey 0\n\tvolup 1\n\tvoldn 0\n\tpedl 0\n\tpowerOnTheDevice\n\tpkey 1\n\tdelay $uefi\n\tpkey 0\n\tvolup 0\n\tdelay 12\n\tpkey 1\n\tvolup 1\n\tpkey 0\n\tvolup 0\n\tlogComment ====== bootToUEFIMenu finish ======\n\ndef bootToFastboot()\n\tlogComment ====== bootToFastboot start ======\n\tpowerOffTheDevice\n\tpkey 0\n\tvolup 0\n\tvoldn 1\n\tpedl 0\n\tpowerOnTheDevice\n\tpkey 1\n\tdelay 800\n\tpkey 0\n\tdelay $fastboot\n\tvoldn 0\n\tdelay 30\n\tvoldn 1\n\tvoldn 0\n\tlogComment ====== bootToFastboot finished ======", "usb_descriptor": "", "pins": [ { "bus": "C", "chip_index": 0, "command": "pshold", "initial_value": false, "input": true, "inverted": false, "pin_number": "0", "priority": 0 }, { "bus": "C", "chip_index": 0, "command": "uim1", "initial_value": false, "input": true, "inverted": false, "pin_number": "1", "priority": 0 }, { "bus": "C", "chip_index": 0, "command": "headset", "initial_value": false, "input": true, "inverted": false, "pin_number": "2", "priority": 0 }, { "bus": "C", "chip_index": 0, "command": "uim2", "initial_value": false, "input": true, "inverted": false, "pin_number": "3", "priority": 0 }, { "bus": "C", "chip_index": 0, "command": "sdcard", "initial_value": false, "input": true, "inverted": false, "pin_number": "4", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "sedl", "initial_value": false, "input": true, "inverted": false, "pin_number": "5", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "usb1", "initial_value": false, "input": true, "inverted": true, "pin_number": "6", "priority": 0 }, { "bus": "C", "chip_index": 0, "command": "sresn", "initial_value": false, "input": true, "inverted": false, "pin_number": "7", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "volup", "initial_value": false, "input": true, "inverted": false, "pin_number": "0", "priority": 0 }, { "bus": "D", "chip_index": 0, "command": "battery", "initial_value": false, "input": true, "inverted": true, "pin_number": "1", "priority": 2 }, { "bus": "D", "chip_index": 0, "command": "voldn", "initial_value": false, "input": true, "inverted": false, "pin_number": "2", "priority": 0 }, { "bus": "D", "chip_index": 0, "command": "pkey", "initial_value": false, "input": true, "inverted": false, "pin_number": "3", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "eud", "initial_value": false, "input": true, "inverted": false, "pin_number": "4", "priority": 0 }, { "bus": "D", "chip_index": 0, "command": "pedl", "initial_value": false, "input": true, "inverted": false, "pin_number": "5", "priority": 0 }, { "bus": "D", "chip_index": 0, "command": "TC_READY_N", "initial_value": true, "input": true, "inverted": false, "pin_number": "6", "priority": 1 }, { "bus": "D", "chip_index": 0, "command": "usb0", "initial_value": false, "input": false, "inverted": true, "pin_number": "7", "priority": 0 } ], "variables": [ { "default_value": "1300", "name": "edl" }, { "default_value": "20000", "name": "reset" }, { "default_value": "20000", "name": "uefi" }, { "default_value": "1000", "name": "fastboot" } ] } pytactl-3.2/pytactl/tac_configs/TAC_FTDI_15.pinout.json000066400000000000000000000145531526550266300227510ustar00rootroot00000000000000{ "$schema": "https://qualcomm.github.io/tac/schemas/pinout-1.0.json", "format": "tac-pinout", "schema_version": "1.0", "source": { "repository": "https://github.com/qualcomm/qcom-test-automation-controller.git", "commit": "757cc972c88e4a1098881b2bc73f3d53eac286be", "path": "configurations", "file": "TAC_FTDI_15.tcnf" }, "bus": [ { "bus": "A", "bus_function": 1, "chip_index": 0 }, { "bus": "B", "bus_function": 1, "chip_index": 0 }, { "bus": "C", "bus_function": 2, "chip_index": 0 }, { "bus": "D", "bus_function": 2, "chip_index": 0 } ], "chip_count": 1, "description": "CSM - Lite", "name": "CSM Lite", "platform_id": 15, "platform_type": "FTDI", "reset_enabled": false, "script": "def powerOffTheDevice() \n\tlogComment ====== powerOffTheDevice sequence start ======\n\n\tbattery 1\n\tpkey 0\n\t\n\tlogComment ====== powerOffTheDevice sequence finish ======\n\ndef powerOnTheDevice()\n\tlogComment ====== powerOnTheDevice sequence start ======\n\n\tdelay 500\n\tbattery 0\n\tpkey 1\n\tdelay 900\n\t\n\n\tlogComment ====== powerOnTheDevice sequence finish ======\n\n\ndef bootToEDL()\n\tlogComment ====== bootToEDL start ======\n\n\tpowerOffTheDevice\n\tpedl 1\n\tpowerOnTheDevice\n\tdelay 3000\n\tpedl 0\n\n\tlogComment ====== bootToEDL finish ======\n\ndef bootToEUD()\n\tlogComment ====== bootToEUD start ======\n\n\tpowerOffTheDevice\n\teud 1\n\tpowerOnTheDevice\n\tdelay 3000\n\teud 0\n\n\tlogComment ====== bootToEUD finish ======\n\ndef bootToUEFIMenu()\n\tlogComment ====== bootToUEFIMenu start ======\n\n\tpowerOffTheDevice\n\tpowerOnTheDevice\n\tdelay 2000\n\tpkey 0\n\n\tlogComment ====== bootToUEFIMenu finish ======\n\ndef bootToFastBoot()\n\tlogComment ====== bootToFastBoot start ======\n\n\tpowerOffTheDevice\n\n\tpkey 0\n\tvolup 0\n\tvoldn 1\n\n\tpedl 0\n\n\tpowerOnTheDevice\n\n\tpkey 1\n\tdelay 8000\n\tpkey 0\n\n\tdelay 8000\n\tvoldn 0\n\tdelay 30\n\tvoldn 1\n\n\tvoldn 0\n\n\tlogComment ====== bootToFastBoot finished ======\n", "usb_descriptor": "ALPACA-LITE CSM DEBUG BOARD", "pins": [ { "bus": "C", "chip_index": 0, "command": "pshold", "initial_value": false, "input": false, "inverted": false, "pin_number": "0", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "0", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "watchdog", "initial_value": false, "input": false, "inverted": false, "pin_number": "1", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "battery", "initial_value": true, "input": false, "inverted": true, "pin_number": "1", "priority": 1 }, { "bus": "C", "chip_index": 0, "command": "bc1", "initial_value": false, "input": false, "inverted": false, "pin_number": "2", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "sysreset", "initial_value": false, "input": false, "inverted": false, "pin_number": "2", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "bc2", "initial_value": false, "input": false, "inverted": false, "pin_number": "3", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "pkey", "initial_value": false, "input": false, "inverted": false, "pin_number": "3", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "bc3", "initial_value": false, "input": false, "inverted": false, "pin_number": "4", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "eud", "initial_value": false, "input": false, "inverted": false, "pin_number": "4", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "bc5", "initial_value": false, "input": false, "inverted": false, "pin_number": "5", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "pedl", "initial_value": false, "input": false, "inverted": false, "pin_number": "5", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "bc6", "initial_value": false, "input": false, "inverted": false, "pin_number": "6", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "6", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "lassenreset", "initial_value": false, "input": false, "inverted": false, "pin_number": "7", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "ddr", "initial_value": false, "input": false, "inverted": false, "pin_number": "7", "priority": 0 } ], "variables": [] } pytactl-3.2/pytactl/tac_configs/TAC_FTDI_16.pinout.json000066400000000000000000000245001526550266300227430ustar00rootroot00000000000000{ "$schema": "https://qualcomm.github.io/tac/schemas/pinout-1.0.json", "format": "tac-pinout", "schema_version": "1.0", "source": { "repository": "https://github.com/qualcomm/qcom-test-automation-controller.git", "commit": "757cc972c88e4a1098881b2bc73f3d53eac286be", "path": "configurations", "file": "TAC_FTDI_16.tcnf" }, "bus": [ { "bus": "A", "bus_function": 1, "chip_index": 0 }, { "bus": "B", "bus_function": 1, "chip_index": 0 }, { "bus": "C", "bus_function": 2, "chip_index": 0 }, { "bus": "D", "bus_function": 2, "chip_index": 0 } ], "chip_count": 1, "description": "CSM - X100", "name": "CSM X100", "platform_id": 16, "platform_type": "FTDI", "reset_enabled": false, "script": "def powerOffTheDevice() \n\tlogComment ====== powerOffTheDevice sequence start ======\n\n\tbattery 1\n\tpkey 0\n\t\n\tlogComment ====== powerOffTheDevice sequence finish ======\n\ndef powerOnTheDevice()\n\tlogComment ====== powerOnTheDevice sequence start ======\n\n\tdelay 500\n\tbattery 0\n\tpkey 1\n\tdelay 900\n\t\n\n\tlogComment ====== powerOnTheDevice sequence finish ======\n\n\ndef bootToEDL()\n\tlogComment ====== bootToEDL start ======\n\n\tpowerOffTheDevice\n\tpedl 1\n\tpowerOnTheDevice\n\tdelay 3000\n\tpedl 0\n\n\tlogComment ====== bootToEDL finish ======\n\ndef bootToEUD()\n\tlogComment ====== bootToEUD start ======\n\n\tpowerOffTheDevice\n\teud 1\n\tpowerOnTheDevice\n\tdelay 3000\n\teud 0\n\n\tlogComment ====== bootToEUD finish ======\n\ndef bootToUEFIMenu()\n\tlogComment ====== bootToUEFIMenu start ======\n\n\tpowerOffTheDevice\n\tpowerOnTheDevice\n\tdelay 2000\n\tpkey 0\n\n\tlogComment ====== bootToUEFIMenu finish ======\n\ndef bootToFastBoot()\n\tlogComment ====== bootToFastBoot start ======\n\n\tpowerOffTheDevice\n\n\tpkey 0\n\tvolup 0\n\tvoldn 1\n\n\tpedl 0\n\n\tpowerOnTheDevice\n\n\tpkey 1\n\tdelay 8000\n\tpkey 0\n\n\tdelay 8000\n\tvoldn 0\n\tdelay 30\n\tvoldn 1\n\n\tvoldn 0\n\n\tlogComment ====== bootToFastBoot finished ======\n", "usb_descriptor": "ALPACA-LITE CSM X100 DEBUG", "pins": [ { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "0", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "0", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "pshold", "initial_value": false, "input": false, "inverted": false, "pin_number": "0", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "volup", "initial_value": false, "input": false, "inverted": false, "pin_number": "0", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "1", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "1", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "uim1", "initial_value": false, "input": false, "inverted": false, "pin_number": "1", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "battery", "initial_value": false, "input": false, "inverted": false, "pin_number": "1", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "2", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "2", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "headset", "initial_value": false, "input": false, "inverted": false, "pin_number": "2", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "voldn", "initial_value": false, "input": false, "inverted": false, "pin_number": "2", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "3", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "3", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "uim2", "initial_value": false, "input": false, "inverted": false, "pin_number": "3", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "pkey", "initial_value": false, "input": false, "inverted": false, "pin_number": "3", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "4", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "4", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "sdcard", "initial_value": false, "input": false, "inverted": false, "pin_number": "4", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "eud", "initial_value": false, "input": false, "inverted": false, "pin_number": "4", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "5", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "5", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "sedl", "initial_value": false, "input": false, "inverted": false, "pin_number": "5", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "pedl", "initial_value": false, "input": false, "inverted": false, "pin_number": "5", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "6", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "6", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "usb1", "initial_value": false, "input": false, "inverted": false, "pin_number": "6", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "6", "priority": 1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "7", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "7", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "sresn", "initial_value": false, "input": false, "inverted": false, "pin_number": "7", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "usb0", "initial_value": false, "input": false, "inverted": false, "pin_number": "7", "priority": -1 } ], "variables": [] } pytactl-3.2/pytactl/tac_configs/TAC_FTDI_18.pinout.json000066400000000000000000000307721526550266300227550ustar00rootroot00000000000000{ "$schema": "https://qualcomm.github.io/tac/schemas/pinout-1.0.json", "format": "tac-pinout", "schema_version": "1.0", "source": { "repository": "https://github.com/qualcomm/qcom-test-automation-controller.git", "commit": "757cc972c88e4a1098881b2bc73f3d53eac286be", "path": "configurations", "file": "TAC_FTDI_18.tcnf" }, "bus": [ { "bus": "A", "bus_function": 2, "chip_index": 0 }, { "bus": "B", "bus_function": 2, "chip_index": 0 }, { "bus": "C", "bus_function": 2, "chip_index": 0 }, { "bus": "D", "bus_function": 2, "chip_index": 0 } ], "chip_count": 1, "description": "FTDI TAC for RIDE MX 4.0", "name": "RIDE MX 4.0 Lite", "platform_id": 18, "platform_type": "FTDI", "reset_enabled": false, "script": "def powerOn()\n\tlogComment ====== on start ======\n\t\n\tpwr_off 0\n\n\tlogComment ====== on finish ======\n\n\ndef powerOff() \n\tlogComment ====== off start ======\n\n\tpwr_off 1\n\n\tlogComment ====== off finish ======\n\n\ndef reset()\n\tlogComment ====== reset start ======\n\n\tpowerOff\n\tdelay 1500\n\tpowerOn\n\n\tlogComment ====== reset finish ======\n\n\ndef bootToEDL()\n\tlogComment ====== s1_md_sail_edl start ======\n\t\n\tsw_dnld 1\n\tss_force_edl 1\n\tpmic_resin 1\n\tdelay 1500\n\tpmic_resin 0\n\tdelay 1000\n\tpowerOn\n\tdelay 5000\n\tdelay $Optional_GPIO_Hold_Time\n\tsw_dnld 0\n\tss_force_edl 0\n\n\tlogComment ====== s1_md_sail_edl finish ======\n\n\ndef bootToUEFI()\n\tlogComment ====== s1_uefi start ======\n\t\n\tpmic_resin 1\n\tdelay 1500\n\tpmic_resin 0\n\tdelay 1000\n\tkpd_pwr 0\n\tuefi 1\n\tsw_dnld 0\n\tkpd_pwr 1\n\tdelay 8000\n\tdelay $Optional_GPIO_Hold_Time\n\tkpd_pwr 0\n\tuefi 0\n\n\tlogComment ====== s1_uefi finish ======\n\n\ndef bootToFastboot()\n\tlogComment ====== s1_fastboot start ======\n\n\tpmic_resin 1\n\tdelay 1500\n\tpmic_resin 0\n\tdelay 800\n\tpmic_resin 1\n\tdelay 8000\n\tdelay $Optional_GPIO_Hold_Time\n\tpmic_resin 0\n\n\tlogComment ====== s1_fastboot finish ======\n\n\ndef s1_reset()\n\tlogComment ====== s1_reset start ======\n\n\tpmic_resin 1\n\tdelay 1500\n\tpmic_resin 0\n\n\tlogComment ====== s1_reset end ======\n\n\ndef s2_reset()\n\tlogComment ====== s2_reset start ======\n\n\ts2_pmic_resin 1\n\tdelay 1500\n\ts2_pmic_resin 0\n\n\tlogComment ====== s2_reset end ======\n\n\ndef s2_md_sail_edl()\n\tlogComment ====== s2_md_sail_edl start ======\n\n\ts2_sw_dnld 1\n\ts2_ss_force_edl 1\n\ts2_pmic_resin 1\n\tdelay 1500\n\ts2_pmic_resin 0\n\tdelay 1000\n\tpowerOn\n\tdelay 5000\n\tdelay $Optional_GPIO_Hold_Time\n\ts2_sw_dnld 0\n\ts2_ss_force_edl 0\n\n\tlogComment ====== s2_md_sail_edl finish ======\n\n\ndef s2_uefi_sequence()\n\tlogComment ====== s2_uefi_sequence start ======\n\n\ts2_pmic_resin 1\n\tdelay 1500\n\ts2_pmic_resin 0\n\tdelay 1000\n\ts2_kpd_pwr 0\n\ts2_uefi 1\n\ts2_sw_dnld 0\n\ts2_kpd_pwr 1\n\tdelay 8000\n\tdelay $Optional_GPIO_Hold_Time\n\ts2_kpd_pwr 0\n\ts2_uefi 0\n\n\tlogComment ====== s2_uefi_sequence finish ======\n\n\ndef s2_fastboot()\n\tlogComment ====== s2_fastboot start ======\n\n\ts2_pmic_resin 1\n\tdelay 1500\n\ts2_pmic_resin 0\n\tdelay 800\n\ts2_pmic_resin 1\n\tdelay 8000\n\tdelay $Optional_GPIO_Hold_Time\n\ts2_pmic_resin 0\n\n\tlogComment ====== s2_fastboot finish ======\n\n\ndef s2_Hboot_EDL_HOLD()\n\tlogComment ====== s2_Hboot_EDL_HOLD start ======\n\n\ts2_sw_dnld 1\n\ts2_ss_force_edl 1\n\n\tlogComment ====== s2_Hboot_EDL_HOLD finish ======\n\n\ndef s2_Hboot_EDL_RELEASE()\n\tlogComment ====== s2_Hboot_EDL_RELEASE start ======\n\n\ts2_sw_dnld 0\n\ts2_ss_force_edl 0\n\n\tlogComment ====== s2_Hboot_EDL_RELEASE finish ======\n\n\ndef classic_mode_set()\n\tlogComment ====== classic_mode_set start ======\n\n\ts2_force_classic 1\n\tpowerOff\n\tdelay 1500\n\tpowerOn\n\n\tlogComment ====== classic_mode_set finish ======\n\n\ndef hboot_mode_set()\n\tlogComment ====== hboot_mode_set start ======\n\n\ts2_force_classic 0\n\n\tlogComment ====== hboot_mode_set finish ======", "usb_descriptor": "RIDE MX 4.0 Lite", "pins": [ { "bus": "A", "chip_index": 0, "command": "s2_force_md_ps_hold", "initial_value": false, "input": false, "inverted": false, "pin_number": "0", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "s2_uefi", "initial_value": false, "input": false, "inverted": false, "pin_number": "0", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "ms_ps_hold", "initial_value": false, "input": false, "inverted": false, "pin_number": "0", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "uefi", "initial_value": false, "input": false, "inverted": false, "pin_number": "0", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "s2_mode0", "initial_value": false, "input": false, "inverted": false, "pin_number": "1", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "s2_force_classic", "initial_value": false, "input": false, "inverted": false, "pin_number": "1", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "mode0", "initial_value": false, "input": false, "inverted": false, "pin_number": "1", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "pwr_off", "initial_value": false, "input": false, "inverted": false, "pin_number": "1", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "s2_md_resout", "initial_value": false, "input": false, "inverted": false, "pin_number": "2", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "s2_pmic_resin", "initial_value": false, "input": false, "inverted": false, "pin_number": "2", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "md_resout", "initial_value": false, "input": false, "inverted": false, "pin_number": "2", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "pmic_resin", "initial_value": false, "input": false, "inverted": false, "pin_number": "2", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "s2_mode1", "initial_value": false, "input": false, "inverted": false, "pin_number": "3", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "s2_kpd_pwr", "initial_value": false, "input": false, "inverted": false, "pin_number": "3", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "mode1", "initial_value": false, "input": false, "inverted": false, "pin_number": "3", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "kpd_pwr", "initial_value": false, "input": false, "inverted": false, "pin_number": "3", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "s2_ss_force_edl", "initial_value": false, "input": false, "inverted": false, "pin_number": "4", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "s2_eud_en", "initial_value": false, "input": false, "inverted": false, "pin_number": "4", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "ss_force_edl", "initial_value": false, "input": false, "inverted": false, "pin_number": "4", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "eud_en", "initial_value": false, "input": false, "inverted": false, "pin_number": "4", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "s2_usb2_disc", "initial_value": false, "input": false, "inverted": false, "pin_number": "5", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "s2_sw_dnld", "initial_value": false, "input": false, "inverted": false, "pin_number": "5", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "usb2", "initial_value": false, "input": false, "inverted": false, "pin_number": "5", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "sw_dnld", "initial_value": false, "input": false, "inverted": false, "pin_number": "5", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "s2_usb1_disc", "initial_value": false, "input": false, "inverted": false, "pin_number": "6", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "6", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "usb1", "initial_value": false, "input": false, "inverted": false, "pin_number": "6", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "oe", "initial_value": true, "input": false, "inverted": false, "pin_number": "6", "priority": 1 }, { "bus": "A", "chip_index": 0, "command": "s2_force_ss_ps_hold", "initial_value": false, "input": false, "inverted": false, "pin_number": "7", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "s2_usb0_disc", "initial_value": false, "input": false, "inverted": false, "pin_number": "7", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "sail_ps_hold", "initial_value": false, "input": false, "inverted": false, "pin_number": "7", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "usb0", "initial_value": false, "input": false, "inverted": false, "pin_number": "7", "priority": -1 } ], "variables": [ { "default_value": "0", "name": "Optional_GPIO_Hold_Time" } ] } pytactl-3.2/pytactl/tac_configs/TAC_FTDI_19.pinout.json000066400000000000000000000273501526550266300227540ustar00rootroot00000000000000{ "$schema": "https://qualcomm.github.io/tac/schemas/pinout-1.0.json", "format": "tac-pinout", "schema_version": "1.0", "source": { "repository": "https://github.com/qualcomm/qcom-test-automation-controller.git", "commit": "757cc972c88e4a1098881b2bc73f3d53eac286be", "path": "configurations", "file": "TAC_FTDI_19.tcnf" }, "bus": [ { "bus": "A", "bus_function": 1, "chip_index": 0 }, { "bus": "B", "bus_function": 1, "chip_index": 0 }, { "bus": "C", "bus_function": 2, "chip_index": 0 }, { "bus": "D", "bus_function": 2, "chip_index": 0 } ], "chip_count": 1, "description": "Hamoa Lite", "name": "Hamoa Lite", "platform_id": 19, "platform_type": "FTDI", "reset_enabled": false, "script": "def powerOffTheDevice() \n\tlogComment ====== powerOffTheDevice sequence start ======\n\n\tbattery 1\n\tusb0 1\n\tusb1 1\n\n\tlogComment ====== powerOffTheDevice sequence finish ======\n\ndef powerOnTheDevice()\n\tlogComment ====== powerOnTheDevice sequence start ======\n\n\tdelay 500\n\tbattery 0\n\tdelay 900\n\tusb0 0\n\tusb1 0\n\tdelay 30\n\n\tlogComment ====== powerOnTheDevice sequence finish ======\n\ndef powerOff()\n\tlogComment ====== powerOff start ======\n\n\tpowerOffTheDevice\n\n\tpkey 0\n\tvolup 0\n\tvoldn 0\n\n\tpedl 0\n\n\tlogComment ====== powerOff finish ======\n\ndef powerOn()\n\tlogComment ====== powerOn start ======\n\n\tpowerOff\n\n\tpowerOnTheDevice\n\n\tpkey 1\n\tdelay 800\n\tpkey 0\n\n\tlogComment ====== powerOn finish ======\n\ndef bootToEDL()\n\tlogComment ====== bootToEDL start ======\n\n\tpowerOffTheDevice\n\n\tpkey 0\n\tvolup 0\n\tvoldn 0\n\n\tpedl 1\n\n\tpowerOnTheDevice\n\n\tpkey 1\n\tdelay $edl\n\tpkey 0\n\n\tpedl 0\n\n\tlogComment ====== bootToEDL finish ======\n\ndef bootToSecondaryEDL()\n\tlogComment ====== bootToSecondaryEDL start ======\n\n\tpowerOffTheDevice\n\n\tpkey 0\n\tvolup 0\n\tvoldn 0\n\n\tsedl 1\n\n\tpowerOnTheDevice\n\n\tpkey 1\n\tdelay 800\n\tpkey 0\n\n\tdelay 1300\n\n\tsedl 0\n\n\tlogComment ====== bootToSecondaryEDL finish ======\n\ndef bootToUEFI()\n\tlogComment ====== bootToUEFIMenu start ======\n\n\tpowerOffTheDevice\n\n\t// Put buttons in a set state\n\tpkey 0\n\tvolup 1\n\tvoldn 0\n\n\tpedl 0\n\n\tpowerOnTheDevice\n\n\tpkey 1\n\tdelay $uefi\n\tpkey 0\n\tvolup 0\n\tdelay 12\n\tpkey 1\n\tvolup 1\n\n\tpkey 0\n\tvolup 0\n\n\tlogComment ====== bootToUEFIMenu finish ======\n\ndef bootToFastboot()\n\tlogComment ====== bootToFastboot start ======\n\n\tpowerOffTheDevice\n\n\tpkey 0\n\tvolup 0\n\tvoldn 1\n\n\tpedl 0\n\n\tpowerOnTheDevice\n\n\tpkey 1\n\tdelay 800\n\tpkey 0\n\n\tdelay $fastboot\n\tvoldn 0\n\tdelay 30\n\tvoldn 1\n\n\tvoldn 0\n\n\tlogComment ====== bootToFastboot finished ======\n\ndef USBoff()\n\tlogComment ====== USBoff start ======\n\n\tusb0 1\n\tusb1 1\n\n\tlogComment ====== USBoff finished ======\n\ndef USBon()\n\tlogComment ====== USBon start ======\n\n\tusb0 0\n\tusb1 0\n\n\tlogComment ====== USBon finished ======", "usb_descriptor": "Hamoa Lite", "pins": [ { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "0", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "0", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "pshold", "initial_value": false, "input": false, "inverted": false, "pin_number": "0", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "volup", "initial_value": false, "input": false, "inverted": false, "pin_number": "0", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "1", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "1", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "uim1", "initial_value": false, "input": false, "inverted": false, "pin_number": "1", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "battery", "initial_value": false, "input": false, "inverted": true, "pin_number": "1", "priority": 2 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "2", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "2", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "headset", "initial_value": false, "input": false, "inverted": false, "pin_number": "2", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "voldn", "initial_value": false, "input": false, "inverted": false, "pin_number": "2", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "3", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "3", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "uim2", "initial_value": false, "input": false, "inverted": false, "pin_number": "3", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "pkey", "initial_value": false, "input": false, "inverted": false, "pin_number": "3", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "4", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "4", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "sdcard", "initial_value": false, "input": false, "inverted": false, "pin_number": "4", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "eud", "initial_value": false, "input": false, "inverted": false, "pin_number": "4", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "5", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "5", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "sedl", "initial_value": false, "input": false, "inverted": false, "pin_number": "5", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "pedl", "initial_value": false, "input": false, "inverted": false, "pin_number": "5", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "6", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "6", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "usb1", "initial_value": false, "input": false, "inverted": true, "pin_number": "6", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "", "initial_value": true, "input": false, "inverted": false, "pin_number": "6", "priority": 1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "7", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "7", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "sresn", "initial_value": false, "input": false, "inverted": false, "pin_number": "7", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "usb0", "initial_value": false, "input": false, "inverted": true, "pin_number": "7", "priority": 2 } ], "variables": [ { "default_value": "1300", "name": "edl" }, { "default_value": "13000", "name": "uefi" }, { "default_value": "1000", "name": "fastboot" } ] } pytactl-3.2/pytactl/tac_configs/TAC_FTDI_20.pinout.json000066400000000000000000000260501526550266300227400ustar00rootroot00000000000000{ "$schema": "https://qualcomm.github.io/tac/schemas/pinout-1.0.json", "format": "tac-pinout", "schema_version": "1.0", "source": { "repository": "https://github.com/qualcomm/qcom-test-automation-controller.git", "commit": "757cc972c88e4a1098881b2bc73f3d53eac286be", "path": "configurations", "file": "TAC_FTDI_20.tcnf" }, "bus": [ { "bus": "A", "bus_function": 1, "chip_index": 0 }, { "bus": "B", "bus_function": 1, "chip_index": 0 }, { "bus": "C", "bus_function": 2, "chip_index": 0 }, { "bus": "D", "bus_function": 2, "chip_index": 0 } ], "chip_count": 1, "description": "FTDI-LITE SDX75 CPE", "name": "SDX75 CPE", "platform_id": 20, "platform_type": "FTDI", "reset_enabled": false, "script": "def powerOffTheDevice() \n\tlogComment ====== powerOffTheDevice sequence start ======\n\n\tbattery 1\n\tusb0 1\n//\tusb1 1\n\n\tlogComment ====== powerOffTheDevice sequence finish ======\n\ndef powerOnTheDevice()\n\tlogComment ====== powerOnTheDevice sequence start ======\n\n\tdelay 500\n\tbattery 0\n\tdelay 900\n\tusb0 0\n//\tusb1 0\n\tdelay 30\n\n\tlogComment ====== powerOnTheDevice sequence finish ======\n\ndef powerOff()\n\tlogComment ====== powerOff start ======\n\n\tpowerOffTheDevice\n\n\tpkey 0\n\tvolup 0\n\tvoldn 0\n\n\tpedl 0\n\n\tlogComment ====== powerOff finish ======\n\ndef powerOn()\n\tlogComment ====== powerOn start ======\n\n\tpowerOff\n\n\tpowerOnTheDevice\n\n\tpkey 1\n\tdelay 800\n\tpkey 0\n\n\tlogComment ====== powerOn finish ======\n\ndef bootToEDL()\n\tlogComment ====== bootToEDL start ======\n\n\tpowerOffTheDevice\n\n\tpkey 0\n\tvolup 0\n\tvoldn 0\n\n\tpedl 1\n\n\tpowerOnTheDevice\n\n\tpkey 1\n\tdelay 1300\n\tpkey 0\n\n\tpedl 0\n\n\tlogComment ====== bootToEDL finish ======\n\ndef bootToSecondaryEDL()\n\tlogComment ====== bootToSecondaryEDL start ======\n\n\tpowerOffTheDevice\n\n\tpkey 0\n\tvolup 0\n\tvoldn 0\n\n\tsedl 1\n\n\tpowerOnTheDevice\n\n\tpkey 1\n\tdelay 800\n\tpkey 0\n\n\tdelay 1300\n\n\tsedl 0\n\n\tlogComment ====== bootToSecondaryEDL finish ======\n\ndef bootToUEFI()\n\tlogComment ======bootToUEFI start ======\n\n\tpowerOffTheDevice\n\n\t// Put buttons in a set state\n\tpkey 0\n\tvolup 1\n\tvoldn 0\n\n\tpedl 0\n\n\tpowerOnTheDevice\n\n\tpkey 1\n\tdelay 8000\n\tpkey 0\n\tvolup 0\n//\tdelay 12\n//\tpkey 1\n//\tvolup 1\n\n//\tpkey 0\n//\tvolup 0\n\n\tlogComment ====== bootToUEFIu finish ======\n\ndef bootToFastBoot()\n\tlogComment ====== bootToFastBoot start ======\n\n\tpowerOffTheDevice\n\n\tdelay 300\n\tbattery 0\n\tpkey 0\n\tvolup 0\n\tvoldn 1\n\n//\tpedl 0\n\n//\t powerOnTheDevice\n\n\tpkey 1\n\tdelay 2000\n\tpkey 0\n\n\tdelay 5000\n\tvoldn 0\n// \tdelay 30\n//\tvoldn 1\n\n//\tvoldn 0\n\n\tlogComment ====== bootToFastBoot finished ======\n", "usb_descriptor": "ALPACA-LITE SDX75 CPE", "pins": [ { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "0", "priority": 99 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "0", "priority": 99 }, { "bus": "C", "chip_index": 0, "command": "pshold", "initial_value": false, "input": false, "inverted": false, "pin_number": "0", "priority": 99 }, { "bus": "D", "chip_index": 0, "command": "volup", "initial_value": false, "input": false, "inverted": false, "pin_number": "0", "priority": 99 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "1", "priority": 99 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "1", "priority": 99 }, { "bus": "C", "chip_index": 0, "command": "uim1", "initial_value": false, "input": false, "inverted": false, "pin_number": "1", "priority": 99 }, { "bus": "D", "chip_index": 0, "command": "battery", "initial_value": false, "input": false, "inverted": true, "pin_number": "1", "priority": 99 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "2", "priority": 99 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "2", "priority": 99 }, { "bus": "C", "chip_index": 0, "command": "headset", "initial_value": false, "input": false, "inverted": false, "pin_number": "2", "priority": 99 }, { "bus": "D", "chip_index": 0, "command": "voldn", "initial_value": false, "input": false, "inverted": false, "pin_number": "2", "priority": 99 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "3", "priority": 99 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "3", "priority": 99 }, { "bus": "C", "chip_index": 0, "command": "uim2", "initial_value": false, "input": false, "inverted": false, "pin_number": "3", "priority": 99 }, { "bus": "D", "chip_index": 0, "command": "pkey", "initial_value": false, "input": false, "inverted": false, "pin_number": "3", "priority": 99 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "4", "priority": 99 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "4", "priority": 99 }, { "bus": "C", "chip_index": 0, "command": "sdcard", "initial_value": false, "input": false, "inverted": false, "pin_number": "4", "priority": 99 }, { "bus": "D", "chip_index": 0, "command": "eud", "initial_value": false, "input": false, "inverted": false, "pin_number": "4", "priority": 99 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "5", "priority": 99 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "5", "priority": 99 }, { "bus": "C", "chip_index": 0, "command": "sedl", "initial_value": false, "input": false, "inverted": false, "pin_number": "5", "priority": 99 }, { "bus": "D", "chip_index": 0, "command": "pedl", "initial_value": false, "input": false, "inverted": false, "pin_number": "5", "priority": 99 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "6", "priority": 99 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "6", "priority": 99 }, { "bus": "C", "chip_index": 0, "command": "usb1", "initial_value": false, "input": false, "inverted": true, "pin_number": "6", "priority": 99 }, { "bus": "D", "chip_index": 0, "command": "", "initial_value": true, "input": false, "inverted": false, "pin_number": "6", "priority": 1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "7", "priority": 99 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "7", "priority": 99 }, { "bus": "C", "chip_index": 0, "command": "sresn", "initial_value": false, "input": false, "inverted": false, "pin_number": "7", "priority": 99 }, { "bus": "D", "chip_index": 0, "command": "usb0", "initial_value": false, "input": false, "inverted": true, "pin_number": "7", "priority": 99 } ], "variables": [] } pytactl-3.2/pytactl/tac_configs/TAC_FTDI_21.pinout.json000066400000000000000000000267741526550266300227560ustar00rootroot00000000000000{ "$schema": "https://qualcomm.github.io/tac/schemas/pinout-1.0.json", "format": "tac-pinout", "schema_version": "1.0", "source": { "repository": "https://github.com/qualcomm/qcom-test-automation-controller.git", "commit": "757cc972c88e4a1098881b2bc73f3d53eac286be", "path": "configurations", "file": "TAC_FTDI_21.tcnf" }, "bus": [ { "bus": "A", "bus_function": 1, "chip_index": 0 }, { "bus": "B", "bus_function": 1, "chip_index": 0 }, { "bus": "C", "bus_function": 2, "chip_index": 0 }, { "bus": "D", "bus_function": 2, "chip_index": 0 } ], "chip_count": 1, "description": "ALPACA LITE IDP35", "name": "KUNO IDP35", "platform_id": 21, "platform_type": "FTDI", "reset_enabled": false, "script": "def powerOffTheDevice() \n\tlogComment ====== powerOffTheDevice sequence start ======\n\n\tbattery 1\n\tusb0 1\n\n\tlogComment ====== powerOffTheDevice sequence finish ======\n\ndef powerOnTheDevice()\n\tlogComment ====== powerOnTheDevice sequence start ======\n\n\tdelay 500\n\tbattery 0\n\tdelay 900\n\tusb0 0\n\tdelay 30\n\n\tlogComment ====== powerOnTheDevice sequence finish ======\n\ndef powerOff()\n\tlogComment ====== powerOff start ======\n\n\tpowerOffTheDevice\n\n\tpkey 0\n\tvolup 0\n\tvoldn 0\n\n\tpedl 0\n\n\tlogComment ====== powerOff finish ======\n\ndef powerOn()\n\tlogComment ====== powerOn start ======\n\n\tpowerOff\n\n\tpowerOnTheDevice\n\n\tpkey 1\n\tdelay 800\n\tpkey 0\n\n\tlogComment ====== powerOn finish ======\n\ndef bootToEDL()\n\tlogComment ====== bootToEDL start ======\n\n\tpowerOffTheDevice\n\n\tpkey 0\n\tvolup 0\n\tvoldn 0\n\n\tpedl 1\n\n\tpowerOnTheDevice\n\n\tpkey 1\n\tdelay 1300\n\tpkey 0\n\n\tpedl 0\n\n\tlogComment ====== bootToEDL finish ======\n\ndef bootToSecondaryEDL()\n\tlogComment ====== bootToSecondaryEDL start ======\n\n\tpowerOffTheDevice\n\n\tpkey 0\n\tvolup 0\n\tvoldn 0\n\n\tsedl 1\n\n\tpowerOnTheDevice\n\n\tpkey 1\n\tdelay 800\n\tpkey 0\n\n\tdelay 1300\n\n\tsedl 0\n\n\tlogComment ====== bootToSecondaryEDL finish ======\n\ndef bootToUEFI()\n\tlogComment ====== bootToUEFIMenu start ======\n\n\tpowerOffTheDevice\n\n\t// Put buttons in a set state\n\tpkey 0\n\tvolup 1\n\tvoldn 0\n\n\tpedl 0\n\n\tpowerOnTheDevice\n\n\tpkey 1\n\tdelay 8000\n\tpkey 0\n\tvolup 0\n\tdelay 12\n\tpkey 1\n\tvolup 1\n\n\tpkey 0\n\tvolup 0\n\n\tlogComment ====== bootToUEFIMenu finish ======\n\ndef bootToFastboot()\n\tlogComment ====== bootToFastBoot start ======\n\n\tpowerOffTheDevice\n\n\tpkey 0\n\tvolup 0\n\tvoldn 1\n\n\tpedl 0\n\n\tpowerOnTheDevice\n\n\tpkey 1\n\tdelay 800\n\tpkey 0\n\n\tdelay $fastboot\n\tvoldn 0\n\tdelay 30\n\tvoldn 1\n\n\tvoldn 0\n\n\tlogComment ====== bootToFastBoot finished ======\n", "usb_descriptor": "ALPACA-LITE IDP35", "pins": [ { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "0", "priority": 99 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "0", "priority": 99 }, { "bus": "C", "chip_index": 0, "command": "pshold", "initial_value": false, "input": false, "inverted": false, "pin_number": "0", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "sedl", "initial_value": false, "input": false, "inverted": false, "pin_number": "0", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "1", "priority": 99 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "1", "priority": 99 }, { "bus": "C", "chip_index": 0, "command": "mode0", "initial_value": false, "input": false, "inverted": false, "pin_number": "1", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "battery", "initial_value": false, "input": false, "inverted": true, "pin_number": "1", "priority": 2 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "2", "priority": 99 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "2", "priority": 99 }, { "bus": "C", "chip_index": 0, "command": "volup", "initial_value": false, "input": false, "inverted": false, "pin_number": "2", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "voldn", "initial_value": false, "input": false, "inverted": false, "pin_number": "2", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "3", "priority": 99 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "3", "priority": 99 }, { "bus": "C", "chip_index": 0, "command": "mode1", "initial_value": false, "input": false, "inverted": false, "pin_number": "3", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "pkey", "initial_value": false, "input": false, "inverted": false, "pin_number": "3", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "4", "priority": 99 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "4", "priority": 99 }, { "bus": "C", "chip_index": 0, "command": "bootconfig2", "initial_value": false, "input": false, "inverted": false, "pin_number": "4", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "eud", "initial_value": false, "input": false, "inverted": false, "pin_number": "4", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "5", "priority": 99 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "5", "priority": 99 }, { "bus": "C", "chip_index": 0, "command": "bootconfig0", "initial_value": false, "input": false, "inverted": false, "pin_number": "5", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "pedl", "initial_value": false, "input": false, "inverted": false, "pin_number": "5", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "6", "priority": 99 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "6", "priority": 99 }, { "bus": "C", "chip_index": 0, "command": "m2poff", "initial_value": false, "input": false, "inverted": false, "pin_number": "6", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "", "initial_value": true, "input": false, "inverted": false, "pin_number": "6", "priority": 1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "7", "priority": 99 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "7", "priority": 99 }, { "bus": "C", "chip_index": 0, "command": "tcready", "initial_value": false, "input": false, "inverted": false, "pin_number": "7", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "usb0", "initial_value": false, "input": false, "inverted": true, "pin_number": "7", "priority": 2 } ], "variables": [ { "default_value": "1300", "name": "edl" }, { "default_value": "8000", "name": "fastboot" }, { "default_value": "8000", "name": "uefi" } ] } pytactl-3.2/pytactl/tac_configs/TAC_FTDI_22.pinout.json000066400000000000000000000260021526550266300227370ustar00rootroot00000000000000{ "$schema": "https://qualcomm.github.io/tac/schemas/pinout-1.0.json", "format": "tac-pinout", "schema_version": "1.0", "source": { "repository": "https://github.com/qualcomm/qcom-test-automation-controller.git", "commit": "757cc972c88e4a1098881b2bc73f3d53eac286be", "path": "configurations", "file": "TAC_FTDI_22.tcnf" }, "bus": [ { "bus": "A", "bus_function": 1, "chip_index": 0 }, { "bus": "B", "bus_function": 1, "chip_index": 0 }, { "bus": "C", "bus_function": 2, "chip_index": 0 }, { "bus": "D", "bus_function": 2, "chip_index": 0 } ], "chip_count": 1, "description": "FTDI-LITE SDX75 QMP", "name": "SDX75 QMP", "platform_id": 22, "platform_type": "FTDI", "reset_enabled": false, "script": "def powerOffTheDevice() \n\tlogComment ====== powerOffTheDevice sequence start ======\n\n\tbattery 1\n\tusb0 1\n//\tusb1 1\n\n\tlogComment ====== powerOffTheDevice sequence finish ======\n\ndef powerOnTheDevice()\n\tlogComment ====== powerOnTheDevice sequence start ======\n\n\tdelay 500\n\tbattery 0\n\tdelay 900\n\tusb0 0\n//\tusb1 0\n\tdelay 30\n\n\tlogComment ====== powerOnTheDevice sequence finish ======\n\ndef powerOff()\n\tlogComment ====== powerOff start ======\n\n\tpowerOffTheDevice\n\n\tpkey 0\n\tvolup 0\n\tvoldn 0\n\n\tpedl 0\n\n\tlogComment ====== powerOff finish ======\n\ndef powerOn()\n\tlogComment ====== powerOn start ======\n\n\tpowerOff\n\n\tpowerOnTheDevice\n\n\tpkey 1\n\tdelay 800\n\tpkey 0\n\n\tlogComment ====== powerOn finish ======\n\ndef bootToEDL()\n\tlogComment ====== bootToEDL start ======\n\n\tpowerOffTheDevice\n\n\tpkey 0\n\tvolup 0\n\tvoldn 0\n\n\tpedl 1\n\n\tpowerOnTheDevice\n\n\tpkey 1\n\tdelay 1300\n\tpkey 0\n\n\tpedl 0\n\n\tlogComment ====== bootToEDL finish ======\n\ndef bootToSecondaryEDL()\n\tlogComment ====== bootToSecondaryEDL start ======\n\n\tpowerOffTheDevice\n\n\tpkey 0\n\tvolup 0\n\tvoldn 0\n\n\tsedl 1\n\n\tpowerOnTheDevice\n\n\tpkey 1\n\tdelay 800\n\tpkey 0\n\n\tdelay 1300\n\n\tsedl 0\n\n\tlogComment ====== bootToSecondaryEDL finish ======\n\ndef bootToUEFIMenu()\n\tlogComment ====== bootToUEFIMenu start ======\n\n\tpowerOffTheDevice\n\n\t// Put buttons in a set state\n\tpkey 0\n\tvolup 1\n\tvoldn 0\n\n\tpedl 0\n\n\tpowerOnTheDevice\n\n\tpkey 1\n\tdelay 8000\n\tpkey 0\n\tvolup 0\n\tdelay 12\n\tpkey 1\n\tvolup 1\n\n\tpkey 0\n\tvolup 0\n\n\tlogComment ====== bootToUEFIMenu finish ======\n\ndef bootToFastBoot()\n\tlogComment ====== bootToFastBoot start ======\n\n\tpowerOffTheDevice\n\n\tpkey 0\n\tvolup 0\n\tvoldn 1\n\n\tpedl 0\n\n\tpowerOnTheDevice\n\n\tpkey 1\n\tdelay 12000\n\tpkey 0\n\n\tdelay 8000\n\tvoldn 0\n\tdelay 30\n\tvoldn 1\n\n\tvoldn 0\n\n\tlogComment ====== bootToFastBoot finished ======\n", "usb_descriptor": "ALPACA-LITE SDX75 QMP", "pins": [ { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "0", "priority": 99 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "0", "priority": 99 }, { "bus": "C", "chip_index": 0, "command": "pshold", "initial_value": false, "input": false, "inverted": false, "pin_number": "0", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "volup", "initial_value": false, "input": false, "inverted": false, "pin_number": "0", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "1", "priority": 99 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "1", "priority": 99 }, { "bus": "C", "chip_index": 0, "command": "uim1", "initial_value": false, "input": false, "inverted": false, "pin_number": "1", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "battery", "initial_value": false, "input": false, "inverted": true, "pin_number": "1", "priority": 2 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "2", "priority": 99 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "2", "priority": 99 }, { "bus": "C", "chip_index": 0, "command": "headset", "initial_value": false, "input": false, "inverted": false, "pin_number": "2", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "voldn", "initial_value": false, "input": false, "inverted": false, "pin_number": "2", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "3", "priority": 99 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "3", "priority": 99 }, { "bus": "C", "chip_index": 0, "command": "uim2", "initial_value": false, "input": false, "inverted": false, "pin_number": "3", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "pkey", "initial_value": false, "input": false, "inverted": false, "pin_number": "3", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "4", "priority": 99 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "4", "priority": 99 }, { "bus": "C", "chip_index": 0, "command": "sdcard", "initial_value": false, "input": false, "inverted": false, "pin_number": "4", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "eud", "initial_value": false, "input": false, "inverted": false, "pin_number": "4", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "5", "priority": 99 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "5", "priority": 99 }, { "bus": "C", "chip_index": 0, "command": "sedl", "initial_value": false, "input": false, "inverted": false, "pin_number": "5", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "pedl", "initial_value": false, "input": false, "inverted": false, "pin_number": "5", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "6", "priority": 99 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "6", "priority": 99 }, { "bus": "C", "chip_index": 0, "command": "usb1", "initial_value": false, "input": false, "inverted": true, "pin_number": "6", "priority": 2 }, { "bus": "D", "chip_index": 0, "command": "", "initial_value": true, "input": false, "inverted": false, "pin_number": "6", "priority": 1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "7", "priority": 99 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "7", "priority": 99 }, { "bus": "C", "chip_index": 0, "command": "sresn", "initial_value": false, "input": false, "inverted": false, "pin_number": "7", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "usb0", "initial_value": false, "input": false, "inverted": true, "pin_number": "7", "priority": 2 } ], "variables": [] } pytactl-3.2/pytactl/tac_configs/TAC_FTDI_23.pinout.json000066400000000000000000000260141526550266300227430ustar00rootroot00000000000000{ "$schema": "https://qualcomm.github.io/tac/schemas/pinout-1.0.json", "format": "tac-pinout", "schema_version": "1.0", "source": { "repository": "https://github.com/qualcomm/qcom-test-automation-controller.git", "commit": "757cc972c88e4a1098881b2bc73f3d53eac286be", "path": "configurations", "file": "TAC_FTDI_23.tcnf" }, "bus": [ { "bus": "A", "bus_function": 1, "chip_index": 0 }, { "bus": "B", "bus_function": 1, "chip_index": 0 }, { "bus": "C", "bus_function": 2, "chip_index": 0 }, { "bus": "D", "bus_function": 2, "chip_index": 0 } ], "chip_count": 1, "description": "FTDI-LITE SDX75 M.2", "name": "SDX75 M.2", "platform_id": 23, "platform_type": "FTDI", "reset_enabled": false, "script": "def powerOffTheDevice() \n\tlogComment ====== powerOffTheDevice sequence start ======\n\n\tbattery 1\n\tusb0 1\n//\tusb1 1\n\n\tlogComment ====== powerOffTheDevice sequence finish ======\n\ndef powerOnTheDevice()\n\tlogComment ====== powerOnTheDevice sequence start ======\n\n\tdelay 500\n\tbattery 0\n\tdelay 900\n\tusb0 0\n//\tusb1 0\n\tdelay 30\n\n\tlogComment ====== powerOnTheDevice sequence finish ======\n\ndef powerOff()\n\tlogComment ====== powerOff start ======\n\n\tpowerOffTheDevice\n\n\tpkey 0\n\tvolup 0\n\tvoldn 0\n\n\tpedl 0\n\n\tlogComment ====== powerOff finish ======\n\ndef powerOn()\n\tlogComment ====== powerOn start ======\n\n\tpowerOff\n\n\tpowerOnTheDevice\n\n\tpkey 1\n\tdelay 800\n\tpkey 0\n\n\tlogComment ====== powerOn finish ======\n\ndef bootToEDL()\n\tlogComment ====== bootToEDL start ======\n\n\tpowerOffTheDevice\n\n\tpkey 0\n\tvolup 0\n\tvoldn 0\n\n\tpedl 1\n\n\tpowerOnTheDevice\n\n\tpkey 1\n\tdelay 1300\n\tpkey 0\n\n\tpedl 0\n\n\tlogComment ====== bootToEDL finish ======\n\ndef bootToSecondaryEDL()\n\tlogComment ====== bootToSecondaryEDL start ======\n\n\tpowerOffTheDevice\n\n\tpkey 0\n\tvolup 0\n\tvoldn 0\n\n\tsedl 1\n\n\tpowerOnTheDevice\n\n\tpkey 1\n\tdelay 800\n\tpkey 0\n\n\tdelay 1300\n\n\tsedl 0\n\n\tlogComment ====== bootToSecondaryEDL finish ======\n\ndef bootToUEFI()\n\tlogComment ====== bootToUEFIMenu start ======\n\n\tpowerOffTheDevice\n\n\t// Put buttons in a set state\n\tpkey 0\n\tvolup 1\n\tvoldn 0\n\n\tpedl 0\n\n\tpowerOnTheDevice\n\n\tpkey 1\n\tdelay 8000\n\tpkey 0\n\tvolup 0\n\tdelay 12\n\tpkey 1\n\tvolup 1\n\n\tpkey 0\n\tvolup 0\n\n\tlogComment ====== bootToUEFIMenu finish ======\n\ndef bootToFastBoot()\n\tlogComment ====== bootToFastBoot start ======\n\n\tpowerOffTheDevice\n\n\tpkey 0\n\tvolup 0\n\tvoldn 1\n\n\tpedl 0\n\n\tpowerOnTheDevice\n\n\tpkey 1\n\tdelay 8000\n\tpkey 0\n\n\tdelay 8000\n\tvoldn 0\n\tdelay 30\n\tvoldn 1\n\n\tvoldn 0\n\n\tlogComment ====== bootToFastBoot finished ======\n", "usb_descriptor": "ALPACA-LITE SDX75 M.2", "pins": [ { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "0", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "0", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "pshold", "initial_value": false, "input": false, "inverted": false, "pin_number": "0", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "usbboot", "initial_value": false, "input": false, "inverted": false, "pin_number": "0", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "1", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "1", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "uim1", "initial_value": false, "input": false, "inverted": false, "pin_number": "1", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "battery", "initial_value": false, "input": false, "inverted": true, "pin_number": "1", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "2", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "2", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "headset", "initial_value": false, "input": false, "inverted": false, "pin_number": "2", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "m2reset", "initial_value": false, "input": false, "inverted": false, "pin_number": "2", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "3", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "3", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "uim2", "initial_value": false, "input": false, "inverted": false, "pin_number": "3", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "fcpo", "initial_value": false, "input": false, "inverted": false, "pin_number": "3", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "4", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "4", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "pciehostbypass", "initial_value": false, "input": false, "inverted": false, "pin_number": "4", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "eud", "initial_value": false, "input": false, "inverted": false, "pin_number": "4", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "5", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "5", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "sedl", "initial_value": false, "input": false, "inverted": false, "pin_number": "5", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "pedl", "initial_value": false, "input": false, "inverted": false, "pin_number": "5", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "6", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "6", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "usb1", "initial_value": false, "input": false, "inverted": true, "pin_number": "6", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "", "initial_value": true, "input": false, "inverted": false, "pin_number": "6", "priority": 1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "7", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "7", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "sresn", "initial_value": false, "input": false, "inverted": false, "pin_number": "7", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "usb0", "initial_value": false, "input": false, "inverted": true, "pin_number": "7", "priority": -1 } ], "variables": [] } pytactl-3.2/pytactl/tac_configs/TAC_FTDI_25.pinout.json000066400000000000000000000247031526550266300227500ustar00rootroot00000000000000{ "$schema": "https://qualcomm.github.io/tac/schemas/pinout-1.0.json", "format": "tac-pinout", "schema_version": "1.0", "source": { "repository": "https://github.com/qualcomm/qcom-test-automation-controller.git", "commit": "757cc972c88e4a1098881b2bc73f3d53eac286be", "path": "configurations", "file": "TAC_FTDI_25.tcnf" }, "bus": [ { "bus": "A", "bus_function": 1, "chip_index": 0 }, { "bus": "B", "bus_function": 1, "chip_index": 0 }, { "bus": "C", "bus_function": 2, "chip_index": 0 }, { "bus": "D", "bus_function": 2, "chip_index": 0 } ], "chip_count": 1, "description": "ALPACA-LITE SDX35 M.2", "name": "ALPACA-LITE SDX35 M.2", "platform_id": 25, "platform_type": "FTDI", "reset_enabled": false, "script": "def powerOffTheDevice() \n\tlogComment ====== powerOffTheDevice sequence start ======\n\n\tbattery 1\n\tusb0 1\n\n\tlogComment ====== powerOffTheDevice sequence finish ======\n\ndef powerOnTheDevice()\n\tlogComment ====== powerOnTheDevice sequence start ======\n\n\tdelay 500\n\tbattery 0\n\tdelay 900\n\tusb0 0\n\tdelay 30\n\n\tlogComment ====== powerOnTheDevice sequence finish ======\n\ndef powerOff()\n\tlogComment ====== powerOff start ======\n\n\tpowerOffTheDevice\n\tvoldn 0\n\tpedl 0\n\tlogComment ====== powerOff finish ======\n\ndef powerOn()\n\tlogComment ====== powerOn start ======\n\n\tpowerOff\n\tpowerOnTheDevice\n\tdelay 800\n\tlogComment ====== powerOn finish ======\n\ndef bootToEDL()\n\tlogComment ====== bootToEDL start ======\n\n\tpowerOffTheDevice\n\tvoldn 0\n\n\tpedl 1\n\n\tpowerOnTheDevice\n\n\tdelay 1300\n\t\n\n\tpedl 0\n\n\tlogComment ====== bootToEDL finish ======\n\ndef bootToSecondaryEDL()\n\tlogComment ====== bootToSecondaryEDL start ======\n\n\tpowerOffTheDevice\n\n\tvoldn 0\n\n\tsedl 1\n\n\tpowerOnTheDevice\n\n\tdelay 800\n\tdelay 1300\n\n\tsedl 0\n\n\tlogComment ====== bootToSecondaryEDL finish ======\n\n\n", "usb_descriptor": "ALPACA-LITE SDX35 M.2", "pins": [ { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "0", "priority": 99 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "0", "priority": 99 }, { "bus": "C", "chip_index": 0, "command": "pshold", "initial_value": false, "input": false, "inverted": false, "pin_number": "0", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "sedl", "initial_value": false, "input": false, "inverted": false, "pin_number": "0", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "1", "priority": 99 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "1", "priority": 99 }, { "bus": "C", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "1", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "battery", "initial_value": false, "input": false, "inverted": true, "pin_number": "1", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "2", "priority": 99 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "2", "priority": 99 }, { "bus": "C", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "2", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "m2rst", "initial_value": false, "input": false, "inverted": false, "pin_number": "2", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "3", "priority": 99 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "3", "priority": 99 }, { "bus": "C", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "3", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "voldn", "initial_value": false, "input": false, "inverted": false, "pin_number": "3", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "4", "priority": 99 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "4", "priority": 99 }, { "bus": "C", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "4", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "pciehb", "initial_value": false, "input": false, "inverted": false, "pin_number": "4", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "5", "priority": 99 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "5", "priority": 99 }, { "bus": "C", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "5", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "pedl", "initial_value": false, "input": false, "inverted": false, "pin_number": "5", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "6", "priority": 99 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "6", "priority": 99 }, { "bus": "C", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "6", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "", "initial_value": true, "input": false, "inverted": false, "pin_number": "6", "priority": 1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "7", "priority": 99 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "7", "priority": 99 }, { "bus": "C", "chip_index": 0, "command": "tcready", "initial_value": false, "input": false, "inverted": false, "pin_number": "7", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "usb0", "initial_value": false, "input": false, "inverted": true, "pin_number": "7", "priority": -1 } ], "variables": [] } pytactl-3.2/pytactl/tac_configs/TAC_FTDI_26.pinout.json000066400000000000000000000264001526550266300227450ustar00rootroot00000000000000{ "$schema": "https://qualcomm.github.io/tac/schemas/pinout-1.0.json", "format": "tac-pinout", "schema_version": "1.0", "source": { "repository": "https://github.com/qualcomm/qcom-test-automation-controller.git", "commit": "757cc972c88e4a1098881b2bc73f3d53eac286be", "path": "configurations", "file": "TAC_FTDI_26.tcnf" }, "bus": [ { "bus": "A", "bus_function": 1, "chip_index": 0 }, { "bus": "B", "bus_function": 1, "chip_index": 0 }, { "bus": "C", "bus_function": 2, "chip_index": 0 }, { "bus": "D", "bus_function": 2, "chip_index": 0 } ], "chip_count": 1, "description": "ALPACA-LITE KUNO DEBUG BOARD", "name": "KUNO DEBUG BOARD", "platform_id": 26, "platform_type": "FTDI", "reset_enabled": false, "script": "def powerOffTheDevice() \n\tlogComment ====== powerOffTheDevice sequence start ======\n\n\tbattery 1\n\tusb0 1\n\n\tlogComment ====== powerOffTheDevice sequence finish ======\n\ndef powerOnTheDevice()\n\tlogComment ====== powerOnTheDevice sequence start ======\n\n\tdelay 500\n\tbattery 0\n\tdelay 900\n\tusb0 0\n\tdelay 30\n\n\tlogComment ====== powerOnTheDevice sequence finish ======\n\ndef powerOff()\n\tlogComment ====== powerOff start ======\n\n\tpowerOffTheDevice\n\n\tpkey 0\n\tvolup 0\n\tvoldn 0\n\n\tpedl 0\n\n\tlogComment ====== powerOff finish ======\n\ndef powerOn()\n\tlogComment ====== powerOn start ======\n\n\tpowerOff\n\n\tpowerOnTheDevice\n\n\tpkey 1\n\tdelay 800\n\tpkey 0\n\n\tlogComment ====== powerOn finish ======\n\ndef bootToEDL()\n\tlogComment ====== bootToEDL start ======\n\n\tpowerOffTheDevice\n\n\tpkey 0\n\tvolup 0\n\tvoldn 0\n\n\tpedl 1\n\n\tpowerOnTheDevice\n\n\tpkey 1\n\tdelay 1300\n\tpkey 0\n\n\tpedl 0\n\n\tlogComment ====== bootToEDL finish ======\n\ndef bootToSecondaryEDL()\n\tlogComment ====== bootToSecondaryEDL start ======\n\n\tpowerOffTheDevice\n\n\tpkey 0\n\tvolup 0\n\tvoldn 0\n\n\tsedl 1\n\n\tpowerOnTheDevice\n\n\tpkey 1\n\tdelay 800\n\tpkey 0\n\n\tdelay 1300\n\n\tsedl 0\n\n\tlogComment ====== bootToSecondaryEDL finish ======\n\ndef bootToUEFI()\n\tlogComment ====== bootToUEFIMenu start ======\n\n\tpowerOffTheDevice\n\n\t// Put buttons in a set state\n\tpkey 0\n\tvolup 1\n\tvoldn 0\n\n\tpedl 0\n\n\tpowerOnTheDevice\n\n\tpkey 1\n\tdelay 8000\n\tpkey 0\n\tvolup 0\n\tdelay 12\n\tpkey 1\n\tvolup 1\n\n\tpkey 0\n\tvolup 0\n\n\tlogComment ====== bootToUEFIMenu finish ======\n\ndef bootToFastboot()\n\tlogComment ====== bootToFastBoot start ======\n\n\tpowerOffTheDevice\n\n\tpkey 0\n\tvolup 0\n\tvoldn 1\n\n\tpedl 0\n\n\tpowerOnTheDevice\n\n\tpkey 1\n\tdelay 2000\n\tpkey 0\n\n\tdelay 6000\n\tvoldn 0\n\tdelay 30\n\tvoldn 1\n\n\tvoldn 0\n\n\tlogComment ====== bootToFastBoot finished ======\n", "usb_descriptor": "ALPACA-LITE KUNO DEBUG BOARD", "pins": [ { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "0", "priority": 99 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "0", "priority": 99 }, { "bus": "C", "chip_index": 0, "command": "pshold", "initial_value": false, "input": false, "inverted": false, "pin_number": "0", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "volup", "initial_value": false, "input": false, "inverted": false, "pin_number": "0", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "1", "priority": 99 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "1", "priority": 99 }, { "bus": "C", "chip_index": 0, "command": "uim1", "initial_value": false, "input": false, "inverted": false, "pin_number": "1", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "battery", "initial_value": false, "input": false, "inverted": true, "pin_number": "1", "priority": 2 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "2", "priority": 99 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "2", "priority": 99 }, { "bus": "C", "chip_index": 0, "command": "headset", "initial_value": false, "input": false, "inverted": false, "pin_number": "2", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "voldn", "initial_value": false, "input": false, "inverted": false, "pin_number": "2", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "3", "priority": 99 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "3", "priority": 99 }, { "bus": "C", "chip_index": 0, "command": "uim2", "initial_value": false, "input": false, "inverted": false, "pin_number": "3", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "pkey", "initial_value": false, "input": false, "inverted": false, "pin_number": "3", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "4", "priority": 99 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "4", "priority": 99 }, { "bus": "C", "chip_index": 0, "command": "sdcard", "initial_value": false, "input": false, "inverted": false, "pin_number": "4", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "eud", "initial_value": false, "input": false, "inverted": false, "pin_number": "4", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "5", "priority": 99 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "5", "priority": 99 }, { "bus": "C", "chip_index": 0, "command": "sedl", "initial_value": false, "input": false, "inverted": false, "pin_number": "5", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "pedl", "initial_value": false, "input": false, "inverted": false, "pin_number": "5", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "6", "priority": 99 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "6", "priority": 99 }, { "bus": "C", "chip_index": 0, "command": "usb1", "initial_value": false, "input": false, "inverted": false, "pin_number": "6", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "", "initial_value": true, "input": false, "inverted": false, "pin_number": "6", "priority": 1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "7", "priority": 99 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "7", "priority": 99 }, { "bus": "C", "chip_index": 0, "command": "tcready", "initial_value": false, "input": false, "inverted": false, "pin_number": "7", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "usb0", "initial_value": false, "input": false, "inverted": true, "pin_number": "7", "priority": 2 } ], "variables": [] } pytactl-3.2/pytactl/tac_configs/TAC_FTDI_27.pinout.json000066400000000000000000000260061526550266300227500ustar00rootroot00000000000000{ "$schema": "https://qualcomm.github.io/tac/schemas/pinout-1.0.json", "format": "tac-pinout", "schema_version": "1.0", "source": { "repository": "https://github.com/qualcomm/qcom-test-automation-controller.git", "commit": "757cc972c88e4a1098881b2bc73f3d53eac286be", "path": "configurations", "file": "TAC_FTDI_27.tcnf" }, "bus": [ { "bus": "A", "bus_function": 1, "chip_index": 0 }, { "bus": "B", "bus_function": 1, "chip_index": 0 }, { "bus": "C", "bus_function": 2, "chip_index": 0 }, { "bus": "D", "bus_function": 2, "chip_index": 0 } ], "chip_count": 1, "description": "Lanai FTDI debug board", "name": "Lanai Debug", "platform_id": 27, "platform_type": "FTDI", "reset_enabled": false, "script": "def powerOffTheDevice() \n\tlogComment ====== powerOffTheDevice sequence start ======\n\n\tbattery 1\n\tusb0 1\n\tusb1 1\n\n\tlogComment ====== powerOffTheDevice sequence finish ======\n\ndef powerOnTheDevice()\n\tlogComment ====== powerOnTheDevice sequence start ======\n\n\tdelay 500\n\tbattery 0\n\tdelay 900\n\tusb0 0\n\tusb1 0\n\tdelay 30\n\n\tlogComment ====== powerOnTheDevice sequence finish ======\n\ndef powerOff()\n\tlogComment ====== powerOff start ======\n\n\tpowerOffTheDevice\n\n\tpkey 0\n\tvolup 0\n\tvoldn 0\n\n\tpedl 0\n\n\tlogComment ====== powerOff finish ======\n\ndef powerOn()\n\tlogComment ====== powerOn start ======\n\n\tpowerOff\n\n\tpowerOnTheDevice\n\n\tpkey 1\n\tdelay 800\n\tpkey 0\n\n\tlogComment ====== powerOn finish ======\n\ndef bootToEDL()\n\tlogComment ====== bootToEDL start ======\n\n\tpowerOffTheDevice\n\n\tpkey 0\n\tvolup 0\n\tvoldn 0\n\n\tpedl 1\n\n\tpowerOnTheDevice\n\n\tpkey 1\n\tdelay 1300\n\tpkey 0\n\n\tpedl 0\n\n\tlogComment ====== bootToEDL finish ======\n\ndef bootToSecondaryEDL()\n\tlogComment ====== bootToSecondaryEDL start ======\n\n\tpowerOffTheDevice\n\n\tpkey 0\n\tvolup 0\n\tvoldn 0\n\n\tsedl 1\n\n\tpowerOnTheDevice\n\n\tpkey 1\n\tdelay 800\n\tpkey 0\n\n\tdelay 1300\n\n\tsedl 0\n\n\tlogComment ====== bootToSecondaryEDL finish ======\n\ndef bootToUEFI()\n\tlogComment ====== bootToUEFIMenu start ======\n\n\tpowerOffTheDevice\n\n\t// Put buttons in a set state\n\tpkey 0\n\tvolup 1\n\tvoldn 0\n\n\tpedl 0\n\n\tpowerOnTheDevice\n\n\tpkey 1\n\tdelay 8000\n\tpkey 0\n\tvolup 0\n\tdelay 12\n\tpkey 1\n\tvolup 1\n\n\tpkey 0\n\tvolup 0\n\n\tlogComment ====== bootToUEFIMenu finish ======\n\ndef bootToFastboot()\n\tlogComment ====== bootToFastboot start ======\n\n\tpowerOffTheDevice\n\n\tpkey 0\n\tvolup 0\n\tvoldn 1\n\n\tpedl 0\n\n\tpowerOnTheDevice\n\n\tpkey 1\n\tdelay 2000\n\tpkey 0\n\n\tdelay 6000\n\tvoldn 0\n\tdelay 30\n\tvoldn 1\n\n\tvoldn 0\n\n\tlogComment ====== bootToFastboot finished ======\n", "usb_descriptor": "ALPACA-LITE LANAI DEBUG BOARD", "pins": [ { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "0", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "0", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "pshold", "initial_value": false, "input": false, "inverted": false, "pin_number": "0", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "volup", "initial_value": false, "input": false, "inverted": false, "pin_number": "0", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "1", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "1", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "uim1", "initial_value": false, "input": false, "inverted": false, "pin_number": "1", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "battery", "initial_value": false, "input": false, "inverted": true, "pin_number": "1", "priority": 2 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "2", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "2", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "headset", "initial_value": false, "input": false, "inverted": false, "pin_number": "2", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "voldn", "initial_value": false, "input": false, "inverted": false, "pin_number": "2", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "3", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "3", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "uim2", "initial_value": false, "input": false, "inverted": false, "pin_number": "3", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "pkey", "initial_value": false, "input": false, "inverted": false, "pin_number": "3", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "4", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "4", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "sdcard", "initial_value": false, "input": false, "inverted": false, "pin_number": "4", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "eud", "initial_value": false, "input": false, "inverted": false, "pin_number": "4", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "5", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "5", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "sedl", "initial_value": false, "input": false, "inverted": false, "pin_number": "5", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "pedl", "initial_value": false, "input": false, "inverted": false, "pin_number": "5", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "6", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "6", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "usb1", "initial_value": false, "input": false, "inverted": true, "pin_number": "6", "priority": 2 }, { "bus": "D", "chip_index": 0, "command": "", "initial_value": true, "input": false, "inverted": false, "pin_number": "6", "priority": 1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "7", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "7", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "sresn", "initial_value": false, "input": false, "inverted": false, "pin_number": "7", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "usb0", "initial_value": false, "input": false, "inverted": true, "pin_number": "7", "priority": 2 } ], "variables": [] } pytactl-3.2/pytactl/tac_configs/TAC_FTDI_28.pinout.json000066400000000000000000000263641526550266300227600ustar00rootroot00000000000000{ "$schema": "https://qualcomm.github.io/tac/schemas/pinout-1.0.json", "format": "tac-pinout", "schema_version": "1.0", "source": { "repository": "https://github.com/qualcomm/qcom-test-automation-controller.git", "commit": "757cc972c88e4a1098881b2bc73f3d53eac286be", "path": "configurations", "file": "TAC_FTDI_28.tcnf" }, "bus": [ { "bus": "A", "bus_function": 1, "chip_index": 0 }, { "bus": "B", "bus_function": 1, "chip_index": 0 }, { "bus": "C", "bus_function": 2, "chip_index": 0 }, { "bus": "D", "bus_function": 2, "chip_index": 0 } ], "chip_count": 1, "description": "ALPACA-LITE CDPS35", "name": "KUNO CDPS35", "platform_id": 28, "platform_type": "FTDI", "reset_enabled": false, "script": "def powerOffTheDevice() \n\tlogComment ====== powerOffTheDevice sequence start ======\n\n\tbattery 1\n\tusb0 1\n\n\tlogComment ====== powerOffTheDevice sequence finish ======\n\ndef powerOnTheDevice()\n\tlogComment ====== powerOnTheDevice sequence start ======\n\n\tdelay 500\n\tbattery 0\n\tdelay 900\n\tusb0 0\n\tdelay 30\n\n\tlogComment ====== powerOnTheDevice sequence finish ======\n\ndef powerOff()\n\tlogComment ====== powerOff start ======\n\n\tpowerOffTheDevice\n\n\tpkey 0\n\tvolup 0\n\tvoldn 0\n\n\tpedl 0\n\n\tlogComment ====== powerOff finish ======\n\ndef powerOn()\n\tlogComment ====== powerOn start ======\n\n\tpowerOff\n\n\tpowerOnTheDevice\n\n\tpkey 1\n\tdelay 800\n\tpkey 0\n\n\tlogComment ====== powerOn finish ======\n\ndef bootToEDL()\n\tlogComment ====== bootToEDL start ======\n\n\tpowerOffTheDevice\n\n\tpkey 0\n\tvolup 0\n\tvoldn 0\n\n\tpedl 1\n\n\tpowerOnTheDevice\n\n\tpkey 1\n\tdelay 1300\n\tpkey 0\n\n\tpedl 0\n\n\tlogComment ====== bootToEDL finish ======\n\ndef bootToSecondaryEDL()\n\tlogComment ====== bootToSecondaryEDL start ======\n\n\tpowerOffTheDevice\n\n\tpkey 0\n\tvolup 0\n\tvoldn 0\n\n\tsedl 1\n\n\tpowerOnTheDevice\n\n\tpkey 1\n\tdelay 800\n\tpkey 0\n\n\tdelay 1300\n\n\tsedl 0\n\n\tlogComment ====== bootToSecondaryEDL finish ======\n\ndef bootToUEFI()\n\tlogComment ====== bootToUEFIMenu start ======\n\n\tpowerOffTheDevice\n\n\t\n\tpkey 0\n\tvolup 1\n\tvoldn 0\n\n\tpedl 0\n\n\tpowerOnTheDevice\n\n\tpkey 1\n\tdelay 8000\n\tdelay 7000\n\tpkey 0\n\tvolup 0\n\tdelay 12\n\tpkey 1\n\tvolup 1\n\n\tpkey 0\n\tvolup 0\n\n\tlogComment ====== bootToUEFIMenu finish ======\n\ndef bootToFastboot()\n\tlogComment ====== bootToFastBoot start ======\n\n\tpowerOffTheDevice\n\n\tpkey 0\n\tvolup 0\n\tvoldn 1\n\n\tpedl 0\n\n\tpowerOnTheDevice\n\n\tpkey 1\n\tdelay 7000\n\tdelay 4000\n\tpkey 0\n\n\tdelay 3000\n\tvoldn 0\n\tdelay 30\n\tvoldn 1\n\n\tvoldn 0\n\n\tlogComment ====== bootToFastBoot finished ======\n", "usb_descriptor": "ALPACA-LITE CDPS35", "pins": [ { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "0", "priority": 99 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "0", "priority": 99 }, { "bus": "C", "chip_index": 0, "command": "pshold", "initial_value": false, "input": false, "inverted": false, "pin_number": "0", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "sedl", "initial_value": false, "input": false, "inverted": false, "pin_number": "0", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "1", "priority": 99 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "1", "priority": 99 }, { "bus": "C", "chip_index": 0, "command": "mode0", "initial_value": false, "input": false, "inverted": false, "pin_number": "1", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "battery", "initial_value": false, "input": false, "inverted": true, "pin_number": "1", "priority": 2 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "2", "priority": 99 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "2", "priority": 99 }, { "bus": "C", "chip_index": 0, "command": "volup", "initial_value": false, "input": false, "inverted": false, "pin_number": "2", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "voldn", "initial_value": false, "input": false, "inverted": false, "pin_number": "2", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "3", "priority": 99 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "3", "priority": 99 }, { "bus": "C", "chip_index": 0, "command": "mode1", "initial_value": false, "input": false, "inverted": false, "pin_number": "3", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "pkey", "initial_value": false, "input": false, "inverted": false, "pin_number": "3", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "4", "priority": 99 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "4", "priority": 99 }, { "bus": "C", "chip_index": 0, "command": "bootconfig2", "initial_value": false, "input": false, "inverted": false, "pin_number": "4", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "eud", "initial_value": false, "input": false, "inverted": false, "pin_number": "4", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "5", "priority": 99 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "5", "priority": 99 }, { "bus": "C", "chip_index": 0, "command": "bootconfig0", "initial_value": false, "input": false, "inverted": false, "pin_number": "5", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "pedl", "initial_value": false, "input": false, "inverted": false, "pin_number": "5", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "6", "priority": 99 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "6", "priority": 99 }, { "bus": "C", "chip_index": 0, "command": "m2poff", "initial_value": false, "input": false, "inverted": false, "pin_number": "6", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "", "initial_value": true, "input": false, "inverted": false, "pin_number": "6", "priority": 1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "7", "priority": 99 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "7", "priority": 99 }, { "bus": "C", "chip_index": 0, "command": "tcready", "initial_value": false, "input": false, "inverted": false, "pin_number": "7", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "usb0", "initial_value": false, "input": false, "inverted": true, "pin_number": "7", "priority": 2 } ], "variables": [] } pytactl-3.2/pytactl/tac_configs/TAC_FTDI_29.pinout.json000066400000000000000000000177111526550266300227550ustar00rootroot00000000000000{ "$schema": "https://qualcomm.github.io/tac/schemas/pinout-1.0.json", "format": "tac-pinout", "schema_version": "1.0", "source": { "repository": "https://github.com/qualcomm/qcom-test-automation-controller.git", "commit": "757cc972c88e4a1098881b2bc73f3d53eac286be", "path": "configurations", "file": "TAC_FTDI_29.tcnf" }, "bus": [ { "bus": "A", "bus_function": 1, "chip_index": 0 }, { "bus": "B", "bus_function": 1, "chip_index": 0 }, { "bus": "C", "bus_function": 2, "chip_index": 0 }, { "bus": "D", "bus_function": 1, "chip_index": 0 } ], "chip_count": 1, "description": "ALPACA-LITE SWITCH CONTROL", "name": "RF Switch Box", "platform_id": 29, "platform_type": "FTDI", "reset_enabled": false, "script": "def powerOffTheDevice() \n\tlogComment ====== powerOffTheDevice sequence start ======\n\n\tbattery 1\n\tusb0 1\n\n\tlogComment ====== powerOffTheDevice sequence finish ======\n\ndef powerOnTheDevice()\n\tlogComment ====== powerOnTheDevice sequence start ======\n\n\tdelay 500\n\tbattery 0\n\tdelay 900\n\tusb0 0\n\tdelay 30\n\n\tlogComment ====== powerOnTheDevice sequence finish ======\n\ndef powerOff()\n\tlogComment ====== powerOff start ======\n\n\tpowerOffTheDevice\n\n\tpkey 0\n\tvolup 0\n\tvoldn 0\n\n\tpedl 0\n\n\tlogComment ====== powerOff finish ======\n\ndef powerOn()\n\tlogComment ====== powerOn start ======\n\n\tpowerOff\n\n\tpowerOnTheDevice\n\n\tpkey 1\n\tdelay 800\n\tpkey 0\n\n\tlogComment ====== powerOn finish ======\n\ndef bootToEDL()\n\tlogComment ====== bootToEDL start ======\n\n\tpowerOffTheDevice\n\n\tpkey 0\n\tvolup 0\n\tvoldn 0\n\n\tpedl 1\n\n\tpowerOnTheDevice\n\n\tpkey 1\n\tdelay 1300\n\tpkey 0\n\n\tpedl 0\n\n\tlogComment ====== bootToEDL finish ======\n\ndef bootToSecondaryEDL()\n\tlogComment ====== bootToSecondaryEDL start ======\n\n\tpowerOffTheDevice\n\n\tpkey 0\n\tvolup 0\n\tvoldn 0\n\n\tsedl 1\n\n\tpowerOnTheDevice\n\n\tpkey 1\n\tdelay 800\n\tpkey 0\n\n\tdelay 1300\n\n\tsedl 0\n\n\tlogComment ====== bootToSecondaryEDL finish ======\n\ndef bootToUEFI()\n\tlogComment ====== bootToUEFIMenu start ======\n\n\tpowerOffTheDevice\n\n\t\n\tpkey 0\n\tvolup 1\n\tvoldn 0\n\n\tpedl 0\n\n\tpowerOnTheDevice\n\n\tpkey 1\n\tdelay 8000\n\tdelay 7000\n\tpkey 0\n\tvolup 0\n\tdelay 12\n\tpkey 1\n\tvolup 1\n\n\tpkey 0\n\tvolup 0\n\n\tlogComment ====== bootToUEFIMenu finish ======\n\ndef bootToFastboot()\n\tlogComment ====== bootToFastBoot start ======\n\n\tpowerOffTheDevice\n\n\tpkey 0\n\tvolup 0\n\tvoldn 1\n\n\tpedl 0\n\n\tpowerOnTheDevice\n\n\tpkey 1\n\tdelay 7000\n\tdelay 4000\n\tpkey 0\n\n\tdelay 3000\n\tvoldn 0\n\tdelay 30\n\tvoldn 1\n\n\tvoldn 0\n\n\tlogComment ====== bootToFastBoot finished ======\n", "usb_descriptor": "ALPACA-LITE SWITCH CONTROL", "pins": [ { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "0", "priority": 99 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "0", "priority": 99 }, { "bus": "C", "chip_index": 0, "command": "VC3", "initial_value": false, "input": false, "inverted": false, "pin_number": "0", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "1", "priority": 99 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "1", "priority": 99 }, { "bus": "C", "chip_index": 0, "command": "VC1", "initial_value": false, "input": false, "inverted": false, "pin_number": "1", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "2", "priority": 99 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "2", "priority": 99 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "3", "priority": 99 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "3", "priority": 99 }, { "bus": "C", "chip_index": 0, "command": "VC2", "initial_value": false, "input": false, "inverted": false, "pin_number": "3", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "4", "priority": 99 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "4", "priority": 99 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "5", "priority": 99 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "5", "priority": 99 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "6", "priority": 99 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "6", "priority": 99 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "7", "priority": 99 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "7", "priority": 99 } ], "variables": [] } pytactl-3.2/pytactl/tac_configs/TAC_FTDI_30.pinout.json000066400000000000000000000231001526550266300227320ustar00rootroot00000000000000{ "$schema": "https://qualcomm.github.io/tac/schemas/pinout-1.0.json", "format": "tac-pinout", "schema_version": "1.0", "source": { "repository": "https://github.com/qualcomm/qcom-test-automation-controller.git", "commit": "757cc972c88e4a1098881b2bc73f3d53eac286be", "path": "configurations", "file": "TAC_FTDI_30.tcnf" }, "bus": [ { "bus": "A", "bus_function": 1, "chip_index": 0 }, { "bus": "B", "bus_function": 2, "chip_index": 0 }, { "bus": "C", "bus_function": 2, "chip_index": 0 }, { "bus": "D", "bus_function": 1, "chip_index": 0 } ], "chip_count": 1, "description": "Disable UART to collect BootKPI", "name": "Qualcomm AIR 8775", "platform_id": 30, "platform_type": "FTDI", "reset_enabled": false, "script": "def powerOffTheDevice() \r\n\tlogComment ====== powerOffTheDevice sequence start ======\r\n\r\n\tbattery 1\r\n\tusb0 1\r\n\tusb1 1\r\n\r\n\tlogComment ====== powerOffTheDevice sequence finish ======\r\n\r\ndef powerOnTheDevice()\r\n\tlogComment ====== powerOnTheDevice sequence start ======\r\n\r\n\tdelay 500\r\n\tbattery 0\r\n\tdelay 900\r\n\tusb0 0\r\n\tusb1 0\r\n\tdelay 30\r\n\r\n\tlogComment ====== powerOnTheDevice sequence finish ======\r\n\r\ndef powerOff()\r\n\tlogComment ====== powerOff start ======\r\n\r\n\tpowerOffTheDevice\r\n\r\n\tpkey 0\r\n\tvolup 0\r\n\tvoldn 0\r\n\r\n\tpedl 0\r\n\r\n\tlogComment ====== powerOff finish ======\r\n\r\ndef powerOn()\r\n\tlogComment ====== powerOn start ======\r\n\r\n\tpowerOff\r\n\r\n\tpowerOnTheDevice\r\n\r\n\tpkey 1\r\n\tdelay 800\r\n\tpkey 0\r\n\r\n\tlogComment ====== powerOn finish ======\r\n\r\ndef bootToEDL()\r\n\tlogComment ====== bootToEDL start ======\r\n\r\n\tpowerOffTheDevice\r\n\r\n\tpkey 0\r\n\tvolup 0\r\n\tvoldn 0\r\n\r\n\tpedl 1\r\n\r\n\tpowerOnTheDevice\r\n\r\n\tpkey 1\r\n\tdelay 1300\r\n\tpkey 0\r\n\r\n\tpedl 0\r\n\r\n\tlogComment ====== bootToEDL finish ======\r\n\r\ndef bootToSecondaryEDL()\r\n\tlogComment ====== bootToSecondaryEDL start ======\r\n\r\n\tpowerOffTheDevice\r\n\r\n\tpkey 0\r\n\tvolup 0\r\n\tvoldn 0\r\n\r\n\tsedl 1\r\n\r\n\tpowerOnTheDevice\r\n\r\n\tpkey 1\r\n\tdelay 800\r\n\tpkey 0\r\n\r\n\tdelay 1300\r\n\r\n\tsedl 0\r\n\r\n\tlogComment ====== bootToSecondaryEDL finish ======\r\n\r\ndef bootToUEFI()\r\n\tlogComment ====== bootToUEFIMenu start ======\r\n\r\n\tpowerOffTheDevice\r\n\r\n\t// Put buttons in a set state\r\n\tpkey 0\r\n\tvolup 1\r\n\tvoldn 0\r\n\r\n\tpedl 0\r\n\r\n\tpowerOnTheDevice\r\n\r\n\tpkey 1\r\n\tdelay 8000\r\n\tpkey 0\r\n\tvolup 0\r\n\tdelay 12\r\n\tpkey 1\r\n\tvolup 1\r\n\r\n\tpkey 0\r\n\tvolup 0\r\n\r\n\tlogComment ====== bootToUEFIMenu finish ======\r\n\r\ndef bootToFastboot()\r\n\tlogComment ====== bootToFastboot start ======\r\n\r\n\tpowerOffTheDevice\r\n\r\n\tpkey 0\r\n\tvolup 0\r\n\tvoldn 1\r\n\r\n\tpedl 0\r\n\r\n\tpowerOnTheDevice\r\n\r\n\tpkey 1\r\n\tdelay 800\r\n\tpkey 0\r\n\r\n\tdelay 8000\r\n\tvoldn 0\r\n\tdelay 30\r\n\tvoldn 1\r\n\r\n\tvoldn 0\r\n\r\n\tlogComment ====== bootToFastboot finished ======\r\n", "usb_descriptor": "ALPACA-LITE AIR 8775", "pins": [ { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "0", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "MD_UART", "initial_value": true, "input": false, "inverted": false, "pin_number": "0", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "SAIL_UART", "initial_value": true, "input": false, "inverted": false, "pin_number": "0", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "volup", "initial_value": false, "input": false, "inverted": false, "pin_number": "0", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "1", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "uim1", "initial_value": false, "input": false, "inverted": false, "pin_number": "1", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "battery", "initial_value": false, "input": false, "inverted": true, "pin_number": "1", "priority": 2 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "2", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "headset", "initial_value": false, "input": false, "inverted": false, "pin_number": "2", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "voldn", "initial_value": false, "input": false, "inverted": false, "pin_number": "2", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "3", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "uim2", "initial_value": false, "input": false, "inverted": false, "pin_number": "3", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "pkey", "initial_value": false, "input": false, "inverted": false, "pin_number": "3", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "4", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "sdcard", "initial_value": false, "input": false, "inverted": false, "pin_number": "4", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "eud", "initial_value": false, "input": false, "inverted": false, "pin_number": "4", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "5", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "sedl", "initial_value": false, "input": false, "inverted": false, "pin_number": "5", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "pedl", "initial_value": false, "input": false, "inverted": false, "pin_number": "5", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "6", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "usb1", "initial_value": false, "input": false, "inverted": false, "pin_number": "6", "priority": 2 }, { "bus": "D", "chip_index": 0, "command": "", "initial_value": true, "input": false, "inverted": false, "pin_number": "6", "priority": 1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "7", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "sresn", "initial_value": false, "input": false, "inverted": false, "pin_number": "7", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "usb0", "initial_value": false, "input": false, "inverted": true, "pin_number": "7", "priority": 2 } ], "variables": [] } pytactl-3.2/pytactl/tac_configs/TAC_FTDI_32.pinout.json000066400000000000000000000271311526550266300227440ustar00rootroot00000000000000{ "$schema": "https://qualcomm.github.io/tac/schemas/pinout-1.0.json", "format": "tac-pinout", "schema_version": "1.0", "source": { "repository": "https://github.com/qualcomm/qcom-test-automation-controller.git", "commit": "757cc972c88e4a1098881b2bc73f3d53eac286be", "path": "configurations", "file": "TAC_FTDI_32.tcnf" }, "bus": [ { "bus": "A", "bus_function": 1, "chip_index": 0 }, { "bus": "B", "bus_function": 1, "chip_index": 0 }, { "bus": "C", "bus_function": 2, "chip_index": 0 }, { "bus": "D", "bus_function": 2, "chip_index": 0 } ], "chip_count": 1, "description": "ALPACA-LITE for Mobile/Compute/Modem_NS ATP debug board", "name": "ATP SM-SC-SDX_NS DEBUG BOARD", "platform_id": 32, "platform_type": "FTDI", "reset_enabled": false, "script": "def powerOffTheDevice() \r\n\tlogComment ====== powerOffTheDevice sequence start ======\r\n\r\n\tbattery 1\r\n\tusb0 1\r\n\tusb1 1\r\n\r\n\tlogComment ====== powerOffTheDevice sequence finish ======\r\n\r\ndef powerOnTheDevice()\r\n\tlogComment ====== powerOnTheDevice sequence start ======\r\n\r\n\tdelay 500\r\n\tbattery 0\r\n\tdelay 900\r\n\tusb0 0\r\n\tusb1 0\r\n\tdelay 30\r\n\r\n\tlogComment ====== powerOnTheDevice sequence finish ======\r\n\r\ndef powerOff()\r\n\tlogComment ====== powerOff start ======\r\n\r\n\tpowerOffTheDevice\r\n\r\n\tpkey 0\r\n\tvolup 0\r\n\tvoldn 0\r\n\r\n\tpedl 0\r\n\r\n\tlogComment ====== powerOff finish ======\r\n\r\ndef powerOn()\r\n\tlogComment ====== powerOn start ======\r\n\r\n\tpowerOff\r\n\r\n\tpowerOnTheDevice\r\n\r\n\tpkey 1\r\n\tdelay 800\r\n\tpkey 0\r\n\r\n\tlogComment ====== powerOn finish ======\r\n\r\ndef bootToEDL()\r\n\tlogComment ====== bootToEDL start ======\r\n\r\n\tpowerOffTheDevice\r\n\r\n\tpkey 0\r\n\tvolup 0\r\n\tvoldn 0\r\n\r\n\tpedl 1\r\n\r\n\tpowerOnTheDevice\r\n\r\n\tpkey 1\r\n\tdelay 1300\r\n\tpkey 0\r\n\r\n\tpedl 0\r\n\r\n\tlogComment ====== bootToEDL finish ======\r\n\r\ndef bootToSecondaryEDL()\r\n\tlogComment ====== bootToSecondaryEDL start ======\r\n\r\n\tpowerOffTheDevice\r\n\r\n\tpkey 0\r\n\tvolup 0\r\n\tvoldn 0\r\n\r\n\tsedl 1\r\n\r\n\tpowerOnTheDevice\r\n\r\n\tpkey 1\r\n\tdelay 800\r\n\tpkey 0\r\n\r\n\tdelay 1300\r\n\r\n\tsedl 0\r\n\r\n\tlogComment ====== bootToSecondaryEDL finish ======\r\n\r\ndef bootToUEFI()\r\n\tlogComment ====== bootToUEFIMenu start ======\r\n\r\n\tpowerOffTheDevice\r\n\r\n\t// Put buttons in a set state\r\n\tpkey 0\r\n\tvolup 1\r\n\tvoldn 0\r\n\r\n\tpedl 0\r\n\r\n\tpowerOnTheDevice\r\n\r\n\tpkey 1\r\n\tdelay 8000\r\n\tpkey 0\r\n\tvolup 0\r\n\tdelay 12\r\n\tpkey 1\r\n\tvolup 1\r\n\r\n\tpkey 0\r\n\tvolup 0\r\n\r\n\tlogComment ====== bootToUEFIMenu finish ======\r\n\r\ndef bootToFastboot()\r\n\tlogComment ====== bootToFastboot start ======\r\n\r\n\tpowerOffTheDevice\r\n\r\n\tpkey 0\r\n\tvolup 0\r\n\tvoldn 1\r\n\r\n\tpedl 0\r\n\r\n\tpowerOnTheDevice\r\n\r\n\tpkey 1\r\n\tdelay 800\r\n\tpkey 0\r\n\r\n\tdelay 8000\r\n\tvoldn 0\r\n\tdelay 30\r\n\tvoldn 1\r\n\r\n\tvoldn 0\r\n\r\n\tlogComment ====== bootToFastboot finished ======\r\n", "usb_descriptor": "ALPACA-LITE SM_SC_SDX ATP", "pins": [ { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "0", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "0", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "pshold", "initial_value": false, "input": false, "inverted": false, "pin_number": "0", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "volup", "initial_value": false, "input": false, "inverted": false, "pin_number": "0", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "1", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "1", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "uim1", "initial_value": false, "input": false, "inverted": false, "pin_number": "1", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "battery", "initial_value": false, "input": false, "inverted": true, "pin_number": "1", "priority": 2 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "2", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "2", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "leboot", "initial_value": false, "input": false, "inverted": false, "pin_number": "2", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "voldn", "initial_value": false, "input": false, "inverted": false, "pin_number": "2", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "3", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "3", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "uim2", "initial_value": false, "input": false, "inverted": false, "pin_number": "3", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "pkey", "initial_value": false, "input": false, "inverted": false, "pin_number": "3", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "4", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "4", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "sdcard", "initial_value": false, "input": false, "inverted": false, "pin_number": "4", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "valen", "initial_value": false, "input": false, "inverted": false, "pin_number": "4", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "5", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "5", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "softpdn", "initial_value": false, "input": false, "inverted": false, "pin_number": "5", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "pedl", "initial_value": false, "input": false, "inverted": false, "pin_number": "5", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "6", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "6", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "usb1", "initial_value": false, "input": false, "inverted": false, "pin_number": "6", "priority": 2 }, { "bus": "D", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "6", "priority": 1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "7", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "7", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "tcready", "initial_value": false, "input": false, "inverted": false, "pin_number": "7", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "usb0", "initial_value": false, "input": false, "inverted": true, "pin_number": "7", "priority": 2 } ], "variables": [] } pytactl-3.2/pytactl/tac_configs/TAC_FTDI_33.pinout.json000066400000000000000000000243371526550266300227520ustar00rootroot00000000000000{ "$schema": "https://qualcomm.github.io/tac/schemas/pinout-1.0.json", "format": "tac-pinout", "schema_version": "1.0", "source": { "repository": "https://github.com/qualcomm/qcom-test-automation-controller.git", "commit": "757cc972c88e4a1098881b2bc73f3d53eac286be", "path": "configurations", "file": "TAC_FTDI_33.tcnf" }, "bus": [ { "bus": "A", "bus_function": 1, "chip_index": 0 }, { "bus": "B", "bus_function": 1, "chip_index": 0 }, { "bus": "C", "bus_function": 2, "chip_index": 0 }, { "bus": "D", "bus_function": 2, "chip_index": 0 } ], "chip_count": 1, "description": "ALPACA-LITE QCX217", "name": "ALPACA-LITE QCX217", "platform_id": 33, "platform_type": "FTDI", "reset_enabled": false, "script": "def powerOffTheDevice() \n\tlogComment ====== powerOffTheDevice sequence start ======\n\n\tbattery 1\n\tusb0 1\n\n\tlogComment ====== powerOffTheDevice sequence finish ======\n\ndef powerOnTheDevice()\n\tlogComment ====== powerOnTheDevice sequence start ======\n\n\tdelay 500\n\tbattery 0\n\tdelay 900\n\tusb0 0\n\tdelay 30\n\n\tlogComment ====== powerOnTheDevice sequence finish ======\n\ndef powerOff()\n\tlogComment ====== powerOff start ======\n\n\tpowerOffTheDevice\n\n\tpkey 0\n\tvolup 0\n\tvoldn 0\n\n\tpedl 0\n\n\tlogComment ====== powerOff finish ======\n\ndef powerOn()\n\tlogComment ====== powerOn start ======\n\n\tpowerOff\n\n\tpowerOnTheDevice\n\n\tpkey 1\n\tdelay 800\n\tpkey 0\n\n\tlogComment ====== powerOn finish ======\n\ndef bootToEDL()\n\tlogComment ====== bootToEDL start ======\n\n\tpowerOffTheDevice\n\n\tpkey 0\n\tvolup 0\n\tvoldn 0\n\n\tpedl 1\n\n\tpowerOnTheDevice\n\n\tpkey 1\n\tdelay 1300\n\tpkey 0\n\n\tpedl 0\n\n\tlogComment ====== bootToEDL finish ======\n\ndef bootToSecondaryEDL()\n\tlogComment ====== bootToSecondaryEDL start ======\n\n\tpowerOffTheDevice\n\n\tpkey 0\n\tvolup 0\n\tvoldn 0\n\n\tsedl 1\n\n\tpowerOnTheDevice\n\n\tpkey 1\n\tdelay 800\n\tpkey 0\n\n\tdelay 1300\n\n\tsedl 0\n\n\tlogComment ====== bootToSecondaryEDL finish ======\n\ndef bootToUEFI()\n\tlogComment ====== bootToUEFIMenu start ======\n\n\tpowerOffTheDevice\n\n\t// Put buttons in a set state\n\tpkey 0\n\tvolup 1\n\tvoldn 0\n\n\tpedl 0\n\n\tpowerOnTheDevice\n\n\tpkey 1\n\tdelay 8000\n\tpkey 0\n\tvolup 0\n\tdelay 12\n\tpkey 1\n\tvolup 1\n\n\tpkey 0\n\tvolup 0\n\n\tlogComment ====== bootToUEFIMenu finish ======\n\ndef bootToFastboot()\n\tlogComment ====== bootToFastBoot start ======\n\n\tpowerOffTheDevice\n\n\tpkey 0\n\tvolup 0\n\tvoldn 1\n\n\tpedl 0\n\n\tpowerOnTheDevice\n\n\tpkey 1\n\tdelay 2000\n\tpkey 0\n\n\tdelay 6000\n\tvoldn 0\n\tdelay 30\n\tvoldn 1\n\n\tvoldn 0\n\n\tlogComment ====== bootToFastBoot finished ======\n", "usb_descriptor": "ALPACA-LITE QCX217", "pins": [ { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "0", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "0", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "volup", "initial_value": false, "input": false, "inverted": false, "pin_number": "0", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "1", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "1", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "uim1", "initial_value": false, "input": false, "inverted": false, "pin_number": "1", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "battery", "initial_value": false, "input": false, "inverted": true, "pin_number": "1", "priority": 2 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "2", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "2", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "voldn", "initial_value": false, "input": false, "inverted": false, "pin_number": "2", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "3", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "3", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "uim2", "initial_value": false, "input": false, "inverted": false, "pin_number": "3", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "pkey", "initial_value": false, "input": false, "inverted": false, "pin_number": "3", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "4", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "4", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "sdcard", "initial_value": false, "input": false, "inverted": false, "pin_number": "4", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "eud", "initial_value": false, "input": false, "inverted": false, "pin_number": "4", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "5", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "5", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "sedl", "initial_value": false, "input": false, "inverted": false, "pin_number": "5", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "pedl", "initial_value": false, "input": false, "inverted": false, "pin_number": "5", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "6", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "6", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "usb1", "initial_value": false, "input": false, "inverted": false, "pin_number": "6", "priority": 2 }, { "bus": "D", "chip_index": 0, "command": "", "initial_value": true, "input": false, "inverted": false, "pin_number": "6", "priority": 1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "7", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "7", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "usb0", "initial_value": false, "input": false, "inverted": true, "pin_number": "7", "priority": 2 } ], "variables": [] } pytactl-3.2/pytactl/tac_configs/TAC_FTDI_36.pinout.json000066400000000000000000000264301526550266300227510ustar00rootroot00000000000000{ "$schema": "https://qualcomm.github.io/tac/schemas/pinout-1.0.json", "format": "tac-pinout", "schema_version": "1.0", "source": { "repository": "https://github.com/qualcomm/qcom-test-automation-controller.git", "commit": "757cc972c88e4a1098881b2bc73f3d53eac286be", "path": "configurations", "file": "TAC_FTDI_36.tcnf" }, "bus": [ { "bus": "A", "bus_function": 1, "chip_index": 0 }, { "bus": "B", "bus_function": 1, "chip_index": 0 }, { "bus": "C", "bus_function": 2, "chip_index": 0 }, { "bus": "D", "bus_function": 2, "chip_index": 0 } ], "chip_count": 1, "description": "XR TAC Config for Matrix v2", "name": "XR TAC Config ", "platform_id": 36, "platform_type": "FTDI", "reset_enabled": false, "script": "def powerOffTheDevice() \n\tlogComment ====== powerOffTheDevice sequence start ======\n\n\tbattery 1\n\tusb0 1\n\tusb1 1\n\n\tlogComment ====== powerOffTheDevice sequence finish ======\n\ndef powerOnTheDevice()\n\tlogComment ====== powerOnTheDevice sequence start ======\n\n\tdelay 500\n\tbattery 0\n\tdelay 900\n\tusb0 0\n\tusb1 0\n\tdelay 30\n\n\tlogComment ====== powerOnTheDevice sequence finish ======\n\ndef powerOff()\n\tlogComment ====== powerOff start ======\n\n\tpowerOffTheDevice\n\n\tpkey 0\n\tvolup 0\n\tvoldn 0\n\n\tpedl 0\n\n\tlogComment ====== powerOff finish ======\n\ndef powerOn()\n\tlogComment ====== powerOn start ======\n\n\tpowerOff\n\n\tpowerOnTheDevice\n\n\tpkey 1\n\tdelay 800\n\tpkey 0\n\n\tlogComment ====== powerOn finish ======\n\ndef bootToEDL()\n\tlogComment ====== bootToEDL start ======\n\n\tpowerOffTheDevice\n\n\tpkey 0\n\tvolup 0\n\tvoldn 0\n\n\tpedl 1\n\n\tpowerOnTheDevice\n\n\tpkey 1\n\tdelay $edl\n\tpkey 0\n\n\tpedl 0\n\n\tlogComment ====== bootToEDL finish ======\n\ndef bootToSecondaryEDL()\n\tlogComment ====== bootToSecondaryEDL start ======\n\n\tpowerOffTheDevice\n\n\tpkey 0\n\tvolup 0\n\tvoldn 0\n\n\tsedl 1\n\n\tpowerOnTheDevice\n\n\tpkey 1\n\tdelay 800\n\tpkey 0\n\n\tdelay 1300\n\n\tsedl 0\n\n\tlogComment ====== bootToSecondaryEDL finish ======\n\ndef bootToUEFI()\n\tlogComment ====== bootToUEFIMenu start ======\n\n\tpowerOffTheDevice\n\n\t// Put buttons in a set state\n\tpkey 0\n\tvolup 1\n\tvoldn 0\n\n\tpedl 0\n\n\tpowerOnTheDevice\n\n\tpkey 1\n\tdelay $uefi\n\tpkey 0\n\tvolup 0\n\tdelay 12\n\tpkey 1\n\tvolup 1\n\n\tpkey 0\n\tvolup 0\n\n\tlogComment ====== bootToUEFIMenu finish ======\n\ndef bootToFastboot()\n\tlogComment ====== bootToFastboot start ======\n\n\tpowerOffTheDevice\n\n\tpkey 0\n\tvolup 0\n\tvoldn 1\n\n\tpedl 0\n\n\tpowerOnTheDevice\n\n\tpkey 1\n\tdelay 800\n\tpkey 0\n\n\tdelay $fastboot\n\tvoldn 0\n\tdelay 30\n\tvoldn 1\n\n\tvoldn 0\n\n\tlogComment ====== bootToFastboot finished ======\n", "usb_descriptor": "ALPACA-LITE FOR XR V1", "pins": [ { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "0", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "0", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "pshold", "initial_value": false, "input": false, "inverted": false, "pin_number": "0", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "volup", "initial_value": false, "input": false, "inverted": false, "pin_number": "0", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "1", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "1", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "back", "initial_value": false, "input": false, "inverted": false, "pin_number": "1", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "battery", "initial_value": false, "input": false, "inverted": true, "pin_number": "1", "priority": 2 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "2", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "2", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "confirm", "initial_value": false, "input": false, "inverted": false, "pin_number": "2", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "voldn", "initial_value": false, "input": false, "inverted": false, "pin_number": "2", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "3", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "3", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "rcmkarker0", "initial_value": false, "input": false, "inverted": false, "pin_number": "3", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "pkey", "initial_value": false, "input": false, "inverted": false, "pin_number": "3", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "4", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "4", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "sdcard", "initial_value": false, "input": false, "inverted": false, "pin_number": "4", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "eud", "initial_value": false, "input": false, "inverted": false, "pin_number": "4", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "5", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "5", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "sedl", "initial_value": false, "input": false, "inverted": false, "pin_number": "5", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "pedl", "initial_value": false, "input": false, "inverted": false, "pin_number": "5", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "6", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "6", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "usb1", "initial_value": false, "input": false, "inverted": true, "pin_number": "6", "priority": 2 }, { "bus": "D", "chip_index": 0, "command": "", "initial_value": true, "input": false, "inverted": false, "pin_number": "6", "priority": 1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "7", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "7", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "sresn", "initial_value": false, "input": false, "inverted": false, "pin_number": "7", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "usb0", "initial_value": false, "input": false, "inverted": true, "pin_number": "7", "priority": 2 } ], "variables": [ { "default_value": "1300", "name": "edl" }, { "default_value": "12000", "name": "fastboot" }, { "default_value": "8000", "name": "uefi" } ] } pytactl-3.2/pytactl/tac_configs/TAC_FTDI_37.pinout.json000066400000000000000000000247721526550266300227610ustar00rootroot00000000000000{ "$schema": "https://qualcomm.github.io/tac/schemas/pinout-1.0.json", "format": "tac-pinout", "schema_version": "1.0", "source": { "repository": "https://github.com/qualcomm/qcom-test-automation-controller.git", "commit": "757cc972c88e4a1098881b2bc73f3d53eac286be", "path": "configurations", "file": "TAC_FTDI_37.tcnf" }, "bus": [ { "bus": "A", "bus_function": 1, "chip_index": 0 }, { "bus": "B", "bus_function": 1, "chip_index": 0 }, { "bus": "C", "bus_function": 2, "chip_index": 0 }, { "bus": "D", "bus_function": 2, "chip_index": 0 } ], "chip_count": 1, "description": "FTDI TAC for RIDE MICRO 4.0", "name": "RIDE MICRO 4.0", "platform_id": 37, "platform_type": "FTDI", "reset_enabled": false, "script": "def powerOn()\n\tlogComment ====== on start ======\n\t\n\tpwr_off 0\n\n\tlogComment ====== on finish ======\n\n\ndef powerOff() \n\tlogComment ====== off start ======\n\n\tpwr_off 1\n\n\tlogComment ====== off finish ======\n\n\ndef reset()\n\tlogComment ====== reset start ======\n\n\tpowerOff\n\tdelay 1500\n\tpowerOn\n\n\tlogComment ====== reset finish ======\n\n\ndef bootToEDL()\n\tlogComment ====== s1_md_sail_edl start ======\n\n\tpowerOff\n\tsw_dnld 1\n\tss_force_edl 1\n\tdelay 1500\n\tpowerOn\n\tdelay 5000\n\tsw_dnld 0\n\tss_force_edl 0\n\n\tlogComment ====== s1_md_sail_edl finish ======\n\n\ndef bootToSecondaryEDL()\n\tlogComment ====== s1_sail_edl start ======\n\n\tpowerOff\n\tss_force_edl 1\n\tdelay 1500\n\tpowerOn\n\tdelay 5000\n\tss_force_edl 0\n\n\tlogComment ====== s1_sail_edl finish ======\n\n\ndef bootToUEFI()\n\tlogComment ====== s1_uefi start ======\n\n\treset \n\tkpd_pwr 0\n\tuefi 1\n\tkpd_pwr 1\n\tdelay 8000\n\tkpd_pwr 0\n\tuefi 0\n\n\tlogComment ====== s1_uefi finish ======\n\n\ndef bootToFastboot()\n\tlogComment ====== s1_fastboot start ======\n\n\tpowerOff\n\tdelay 1500\n\tusb2 1\n\tdelay 500\n\tpowerOn\n\tdelay 8000\n\tusb2 0\n\n\tlogComment ====== s1_fastboot finish ======\n\n\n\n", "usb_descriptor": "RIDE MICRO 4.0", "pins": [ { "bus": "A", "chip_index": 0, "command": "s2_force_md_ps_hold", "initial_value": false, "input": false, "inverted": false, "pin_number": "0", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "s2_uefi", "initial_value": false, "input": false, "inverted": false, "pin_number": "0", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "ms_ps_hold", "initial_value": false, "input": false, "inverted": false, "pin_number": "0", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "uefi", "initial_value": false, "input": false, "inverted": false, "pin_number": "0", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "s2_mode0", "initial_value": false, "input": false, "inverted": false, "pin_number": "1", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "s2_force_classic", "initial_value": false, "input": false, "inverted": false, "pin_number": "1", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "mode0", "initial_value": false, "input": false, "inverted": false, "pin_number": "1", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "pwr_off", "initial_value": false, "input": false, "inverted": false, "pin_number": "1", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "s2_md_resout", "initial_value": false, "input": false, "inverted": false, "pin_number": "2", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "s2_pmic_resin", "initial_value": false, "input": false, "inverted": false, "pin_number": "2", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "md_resout", "initial_value": false, "input": false, "inverted": false, "pin_number": "2", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "pmic_resin", "initial_value": false, "input": false, "inverted": false, "pin_number": "2", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "s2_mode1", "initial_value": false, "input": false, "inverted": false, "pin_number": "3", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "s2_kpd_pwr", "initial_value": false, "input": false, "inverted": false, "pin_number": "3", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "mode1", "initial_value": false, "input": false, "inverted": false, "pin_number": "3", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "kpd_pwr", "initial_value": false, "input": false, "inverted": false, "pin_number": "3", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "s2_ss_force_edl", "initial_value": false, "input": false, "inverted": false, "pin_number": "4", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "s2_eud_en", "initial_value": false, "input": false, "inverted": false, "pin_number": "4", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "ss_force_edl", "initial_value": false, "input": false, "inverted": false, "pin_number": "4", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "eud_en", "initial_value": false, "input": false, "inverted": false, "pin_number": "4", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "s2_usb2_disc", "initial_value": false, "input": false, "inverted": false, "pin_number": "5", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "s2_sw_dnld", "initial_value": false, "input": false, "inverted": false, "pin_number": "5", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "usb2", "initial_value": false, "input": false, "inverted": false, "pin_number": "5", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "sw_dnld", "initial_value": false, "input": false, "inverted": false, "pin_number": "5", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "s2_usb1_disc", "initial_value": false, "input": false, "inverted": false, "pin_number": "6", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "6", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "usb1", "initial_value": false, "input": false, "inverted": false, "pin_number": "6", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "oe", "initial_value": true, "input": false, "inverted": false, "pin_number": "6", "priority": 1 }, { "bus": "A", "chip_index": 0, "command": "s2_force_ss_ps_hold", "initial_value": false, "input": false, "inverted": false, "pin_number": "7", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "s2_usb0_disc", "initial_value": false, "input": false, "inverted": false, "pin_number": "7", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "sail_ps_hold", "initial_value": false, "input": false, "inverted": false, "pin_number": "7", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "usb0", "initial_value": false, "input": false, "inverted": false, "pin_number": "7", "priority": -1 } ], "variables": [] } pytactl-3.2/pytactl/tac_configs/TAC_FTDI_38.pinout.json000066400000000000000000000254171526550266300227570ustar00rootroot00000000000000{ "$schema": "https://qualcomm.github.io/tac/schemas/pinout-1.0.json", "format": "tac-pinout", "schema_version": "1.0", "source": { "repository": "https://github.com/qualcomm/qcom-test-automation-controller.git", "commit": "757cc972c88e4a1098881b2bc73f3d53eac286be", "path": "configurations", "file": "TAC_FTDI_38.tcnf" }, "bus": [ { "bus": "A", "bus_function": 1, "chip_index": 0 }, { "bus": "B", "bus_function": 1, "chip_index": 0 }, { "bus": "C", "bus_function": 2, "chip_index": 0 }, { "bus": "D", "bus_function": 2, "chip_index": 0 } ], "chip_count": 1, "description": "PAKALA CDP with GG GPIOs", "name": "PAKALA CDP", "platform_id": 38, "platform_type": "FTDI", "reset_enabled": false, "script": "def powerOffTheDevice() \n\tlogComment ====== powerOffTheDevice sequence start ======\n\n\tbattery 1\n\tusb0 1\n\t//usb1 1\n\n\tlogComment ====== powerOffTheDevice sequence finish ======\n\ndef powerOnTheDevice()\n\tlogComment ====== powerOnTheDevice sequence start ======\n\n\tdelay 500\n\tbattery 0\n\tdelay 900\n\tusb0 0\n\t//usb1 0\n\tdelay 30\n\n\tlogComment ====== powerOnTheDevice sequence finish ======\n\ndef powerOff()\n\tlogComment ====== powerOff start ======\n\n\tpowerOffTheDevice\n\n\tpkey 0\n\tvolup 0\n\tvoldn 0\n\n\tpedl 0\n\n\tlogComment ====== powerOff finish ======\n\ndef powerOn()\n\tlogComment ====== powerOn start ======\n\n\tpowerOff\n\n\tpowerOnTheDevice\n\n\tpkey 1\n\tdelay 3500\n\t//EUFI requires > 3sec delay between power/pkey\n\tpkey 0\n\n\tlogComment ====== powerOn finish ======\n\ndef bootToEDL()\n\tlogComment ====== bootToEDL start ======\n\n\tpowerOffTheDevice\n\n\tpkey 0\n\tvolup 0\n\tvoldn 0\n\n\tpedl 1\n\n\tpowerOnTheDevice\n\n\tpkey 1\n\tdelay 1300\n\tpkey 0\n\n\tpedl 0\n\n\tlogComment ====== bootToEDL finish ======\n\ndef bootToUEFI()\n\tlogComment ====== bootToUEFIMenu start ======\n\n\tpowerOffTheDevice\n\n\t// Put buttons in a set state\n\tpkey 0\n\tvolup 1\n\tvoldn 0\n\n\tpedl 0\n\n\tpowerOnTheDevice\n\n\tpkey 1\n\tdelay 8000\n\tpkey 0\n\tvolup 0\n\tdelay 12\n\tpkey 1\n\n\tpkey 0\n\tvolup 0\n\n\tlogComment ====== bootToUEFIMenu finish ======\n\ndef bootToFastboot()\n\tlogComment ====== bootToFastboot start ======\n\n\tpowerOffTheDevice\n\n\tpkey 0\n\tvolup 0\n\tvoldn 1\n\n\tpedl 0\n\n\tpowerOnTheDevice\n\n\tpkey 1\n\tdelay 2000\n\tpkey 0\n\n\tdelay 6000\n\tvoldn 0\n\tdelay 30\n\tvoldn 1\n\n\tvoldn 0\n\n\tlogComment ====== bootToFastboot finished ======\n", "usb_descriptor": "ALPACA-LITE PAKALA CDP", "pins": [ { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "0", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "0", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "pshold", "initial_value": false, "input": false, "inverted": false, "pin_number": "0", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "volup", "initial_value": false, "input": false, "inverted": false, "pin_number": "0", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "1", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "1", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "mode0_gg4", "initial_value": false, "input": false, "inverted": false, "pin_number": "1", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "battery", "initial_value": false, "input": false, "inverted": true, "pin_number": "1", "priority": 2 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "2", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "2", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "gg2", "initial_value": false, "input": false, "inverted": false, "pin_number": "2", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "voldn", "initial_value": false, "input": false, "inverted": false, "pin_number": "2", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "3", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "3", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "mode1_gg5", "initial_value": false, "input": false, "inverted": false, "pin_number": "3", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "pkey", "initial_value": false, "input": false, "inverted": false, "pin_number": "3", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "4", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "4", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "sdcard_gg3", "initial_value": false, "input": false, "inverted": false, "pin_number": "4", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "eud", "initial_value": false, "input": false, "inverted": false, "pin_number": "4", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "5", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "5", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "gg1", "initial_value": false, "input": false, "inverted": false, "pin_number": "5", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "pedl", "initial_value": false, "input": false, "inverted": false, "pin_number": "5", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "6", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "6", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": true, "pin_number": "6", "priority": 2 }, { "bus": "D", "chip_index": 0, "command": "", "initial_value": true, "input": false, "inverted": false, "pin_number": "6", "priority": 1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "7", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "7", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "sresn", "initial_value": false, "input": false, "inverted": false, "pin_number": "7", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "usb0", "initial_value": false, "input": false, "inverted": true, "pin_number": "7", "priority": 2 } ], "variables": [] } pytactl-3.2/pytactl/tac_configs/TAC_FTDI_39.pinout.json000066400000000000000000000250151526550266300227520ustar00rootroot00000000000000{ "$schema": "https://qualcomm.github.io/tac/schemas/pinout-1.0.json", "format": "tac-pinout", "schema_version": "1.0", "source": { "repository": "https://github.com/qualcomm/qcom-test-automation-controller.git", "commit": "757cc972c88e4a1098881b2bc73f3d53eac286be", "path": "configurations", "file": "TAC_FTDI_39.tcnf" }, "bus": [ { "bus": "A", "bus_function": 1, "chip_index": 0 }, { "bus": "B", "bus_function": 1, "chip_index": 0 }, { "bus": "C", "bus_function": 2, "chip_index": 0 }, { "bus": "D", "bus_function": 2, "chip_index": 0 } ], "chip_count": 1, "description": "FTDI TAC for RB8 IQ-9075-EVK", "name": "RB8 IQ-9075-EVK", "platform_id": 39, "platform_type": "FTDI", "reset_enabled": false, "script": "def powerOn()\n\tlogComment ====== on start ======\n\t\n\tpwr_off 0\n\n\tlogComment ====== on finish ======\n\n\ndef powerOff() \n\tlogComment ====== off start ======\n\n\tpwr_off 1\n\n\tlogComment ====== off finish ======\n\n\ndef reset()\n\tlogComment ====== reset start ======\n\n\tpowerOff\n\tdelay 1500\n\tpowerOn\n\n\tlogComment ====== reset finish ======\n\n\ndef bootToEDL()\n\tlogComment ====== s1_md_sail_edl start ======\n\n\tpowerOff\n\tsw_dnld 1\n\tss_force_edl 1\n\tdelay 1500\n\tpowerOn\n\tdelay 5000\n\tsw_dnld 0\n\tss_force_edl 0\n\n\tlogComment ====== s1_md_sail_edl finish ======\n\n\ndef bootToSecondaryEDL()\n\tlogComment ====== s1_sail_edl start ======\n\n\tpowerOff\n\tss_force_edl 1\n\tdelay 1500\n\tpowerOn\n\tdelay 5000\n\tss_force_edl 0\n\n\tlogComment ====== s1_sail_edl finish ======\n\n\ndef bootToUEFI()\n\tlogComment ====== s1_uefi start ======\n\n\treset \n\tkpd_pwr 0\n\tuefi 1\n\tkpd_pwr 1\n\tdelay 8000\n\tkpd_pwr 0\n\tuefi 0\n\n\tlogComment ====== s1_uefi finish ======\n\n\ndef bootToFastboot()\n\tlogComment ====== s1_fastboot start ======\n\n\tpowerOff\n\tdelay 1500\n\tusb2 1\n\tdelay 500\n\tpowerOn\n\tdelay 8000\n\tusb2 0\n\n\tlogComment ====== s1_fastboot finish ======\n\n\n\n", "usb_descriptor": "ALPACA-LITE FOR RB8 IQ-9075-EVK", "pins": [ { "bus": "A", "chip_index": 0, "command": "s2_force_md_ps_hold", "initial_value": false, "input": false, "inverted": false, "pin_number": "0", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "s2_uefi", "initial_value": false, "input": false, "inverted": false, "pin_number": "0", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "ms_ps_hold", "initial_value": false, "input": false, "inverted": false, "pin_number": "0", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "uefi", "initial_value": false, "input": false, "inverted": false, "pin_number": "0", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "s2_mode0", "initial_value": false, "input": false, "inverted": false, "pin_number": "1", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "s2_force_classic", "initial_value": false, "input": false, "inverted": false, "pin_number": "1", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "mode0", "initial_value": false, "input": false, "inverted": false, "pin_number": "1", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "pwr_off", "initial_value": false, "input": false, "inverted": false, "pin_number": "1", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "s2_md_resout", "initial_value": false, "input": false, "inverted": false, "pin_number": "2", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "s2_pmic_resin", "initial_value": false, "input": false, "inverted": false, "pin_number": "2", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "md_resout", "initial_value": false, "input": false, "inverted": false, "pin_number": "2", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "pmic_resin", "initial_value": false, "input": false, "inverted": false, "pin_number": "2", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "s2_mode1", "initial_value": false, "input": false, "inverted": false, "pin_number": "3", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "s2_kpd_pwr", "initial_value": false, "input": false, "inverted": false, "pin_number": "3", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "mode1", "initial_value": false, "input": false, "inverted": false, "pin_number": "3", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "kpd_pwr", "initial_value": false, "input": false, "inverted": false, "pin_number": "3", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "s2_ss_force_edl", "initial_value": false, "input": false, "inverted": false, "pin_number": "4", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "s2_eud_en", "initial_value": false, "input": false, "inverted": false, "pin_number": "4", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "ss_force_edl", "initial_value": false, "input": false, "inverted": false, "pin_number": "4", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "eud_en", "initial_value": false, "input": false, "inverted": false, "pin_number": "4", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "s2_usb2_disc", "initial_value": false, "input": false, "inverted": false, "pin_number": "5", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "s2_sw_dnld", "initial_value": false, "input": false, "inverted": false, "pin_number": "5", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "usb2", "initial_value": false, "input": false, "inverted": false, "pin_number": "5", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "sw_dnld", "initial_value": false, "input": false, "inverted": false, "pin_number": "5", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "s2_usb1_disc", "initial_value": false, "input": false, "inverted": false, "pin_number": "6", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "6", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "usb1", "initial_value": false, "input": false, "inverted": false, "pin_number": "6", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "oe", "initial_value": true, "input": false, "inverted": false, "pin_number": "6", "priority": 1 }, { "bus": "A", "chip_index": 0, "command": "s2_force_ss_ps_hold", "initial_value": false, "input": false, "inverted": false, "pin_number": "7", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "s2_usb0_disc", "initial_value": false, "input": false, "inverted": false, "pin_number": "7", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "sail_ps_hold", "initial_value": false, "input": false, "inverted": false, "pin_number": "7", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "usb0", "initial_value": false, "input": false, "inverted": false, "pin_number": "7", "priority": -1 } ], "variables": [] } pytactl-3.2/pytactl/tac_configs/TAC_FTDI_40.pinout.json000066400000000000000000000254211526550266300227430ustar00rootroot00000000000000{ "$schema": "https://qualcomm.github.io/tac/schemas/pinout-1.0.json", "format": "tac-pinout", "schema_version": "1.0", "source": { "repository": "https://github.com/qualcomm/qcom-test-automation-controller.git", "commit": "757cc972c88e4a1098881b2bc73f3d53eac286be", "path": "configurations", "file": "TAC_FTDI_40.tcnf" }, "bus": [ { "bus": "A", "bus_function": 1, "chip_index": 0 }, { "bus": "B", "bus_function": 1, "chip_index": 0 }, { "bus": "C", "bus_function": 2, "chip_index": 0 }, { "bus": "D", "bus_function": 2, "chip_index": 0 } ], "chip_count": 1, "description": "KAANAPALI CDP with GG GPIOs", "name": "KAANAPALI CDP", "platform_id": 40, "platform_type": "FTDI", "reset_enabled": false, "script": "def powerOffTheDevice() \n\tlogComment ====== powerOffTheDevice sequence start ======\n\n\tbattery 1\n\tusb0 1\n\t//usb1 1\n\n\tlogComment ====== powerOffTheDevice sequence finish ======\n\ndef powerOnTheDevice()\n\tlogComment ====== powerOnTheDevice sequence start ======\n\n\tdelay 500\n\tbattery 0\n\tdelay 900\n\tusb0 0\n\t//usb1 0\n\tdelay 30\n\n\tlogComment ====== powerOnTheDevice sequence finish ======\n\ndef powerOff()\n\tlogComment ====== powerOff start ======\n\n\tpowerOffTheDevice\n\n\tpkey 0\n\tvolup 0\n\tvoldn 0\n\n\tpedl 0\n\n\tlogComment ====== powerOff finish ======\n\ndef powerOn()\n\tlogComment ====== powerOn start ======\n\n\tpowerOff\n\n\tpowerOnTheDevice\n\n\tpkey 1\n\tdelay 3500\n\t//EUFI requires > 3sec delay between power/pkey\n\tpkey 0\n\n\tlogComment ====== powerOn finish ======\n\ndef bootToEDL()\n\tlogComment ====== bootToEDL start ======\n\n\tpowerOffTheDevice\n\n\tpkey 0\n\tvolup 0\n\tvoldn 0\n\n\tpedl 1\n\n\tpowerOnTheDevice\n\n\tpkey 1\n\tdelay 1300\n\tpkey 0\n\n\tpedl 0\n\n\tlogComment ====== bootToEDL finish ======\n\ndef bootToUEFI()\n\tlogComment ====== bootToUEFIMenu start ======\n\n\tpowerOffTheDevice\n\n\t// Put buttons in a set state\n\tpkey 0\n\tvolup 1\n\tvoldn 0\n\n\tpedl 0\n\n\tpowerOnTheDevice\n\n\tpkey 1\n\tdelay 8000\n\tpkey 0\n\tvolup 0\n\tdelay 12\n\tpkey 1\n\n\tpkey 0\n\tvolup 0\n\n\tlogComment ====== bootToUEFIMenu finish ======\n\ndef bootToFastboot()\n\tlogComment ====== bootToFastboot start ======\n\n\tpowerOffTheDevice\n\n\tpkey 0\n\tvolup 0\n\tvoldn 1\n\n\tpedl 0\n\n\tpowerOnTheDevice\n\n\tpkey 1\n\tdelay 2000\n\tpkey 0\n\n\tdelay 6000\n\tvoldn 0\n\tdelay 30\n\tvoldn 1\n\n\tvoldn 0\n\n\tlogComment ====== bootToFastboot finished ======\n", "usb_descriptor": "ALPACA-LITE KAANAPALI CDP", "pins": [ { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "0", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "0", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "pshold", "initial_value": false, "input": false, "inverted": false, "pin_number": "0", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "volup", "initial_value": false, "input": false, "inverted": false, "pin_number": "0", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "1", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "1", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "mode0", "initial_value": false, "input": false, "inverted": false, "pin_number": "1", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "battery", "initial_value": false, "input": false, "inverted": true, "pin_number": "1", "priority": 2 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "2", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "2", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "gg2", "initial_value": false, "input": false, "inverted": false, "pin_number": "2", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "voldn", "initial_value": false, "input": false, "inverted": false, "pin_number": "2", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "3", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "3", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "mode1", "initial_value": false, "input": false, "inverted": false, "pin_number": "3", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "pkey", "initial_value": false, "input": false, "inverted": false, "pin_number": "3", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "4", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "4", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "sdcard", "initial_value": false, "input": false, "inverted": false, "pin_number": "4", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "eud", "initial_value": false, "input": false, "inverted": false, "pin_number": "4", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "5", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "5", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "gg1", "initial_value": false, "input": false, "inverted": false, "pin_number": "5", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "pedl", "initial_value": false, "input": false, "inverted": false, "pin_number": "5", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "6", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "6", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "gg3", "initial_value": false, "input": false, "inverted": false, "pin_number": "6", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "", "initial_value": true, "input": false, "inverted": false, "pin_number": "6", "priority": 1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "7", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "7", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "sresn", "initial_value": false, "input": false, "inverted": false, "pin_number": "7", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "usb0", "initial_value": false, "input": false, "inverted": true, "pin_number": "7", "priority": 2 } ], "variables": [] } pytactl-3.2/pytactl/tac_configs/TAC_FTDI_41.pinout.json000066400000000000000000000266541526550266300227550ustar00rootroot00000000000000{ "$schema": "https://qualcomm.github.io/tac/schemas/pinout-1.0.json", "format": "tac-pinout", "schema_version": "1.0", "source": { "repository": "https://github.com/qualcomm/qcom-test-automation-controller.git", "commit": "757cc972c88e4a1098881b2bc73f3d53eac286be", "path": "configurations", "file": "TAC_FTDI_41.tcnf" }, "bus": [ { "bus": "A", "bus_function": 1, "chip_index": 0 }, { "bus": "B", "bus_function": 1, "chip_index": 0 }, { "bus": "C", "bus_function": 2, "chip_index": 0 }, { "bus": "D", "bus_function": 2, "chip_index": 0 } ], "chip_count": 1, "description": "ALPACA-LITE for AP-MDM Fusion ATP debug board", "name": "SDX-SM_FUSION ATP DEBUG BOARD", "platform_id": 41, "platform_type": "FTDI", "reset_enabled": false, "script": "def powerOffTheDevice() \n\tlogComment ====== powerOffTheDevice sequence start ======\n\n\tpower 1\n\tusb0 1\n\t//usb1 1\n\n\tlogComment ====== powerOffTheDevice sequence finish ======\n\ndef powerOnTheDevice()\n\tlogComment ====== powerOnTheDevice sequence start ======\n\n\tdelay 500\n\tpower 0\n\tdelay 900\n\tusb0 0\n\t//usb1 0\n\tdelay 30\n\n\tlogComment ====== powerOnTheDevice sequence finish ======\n\ndef powerOff()\n\tlogComment ====== powerOff start ======\n\n\tpowerOffTheDevice\n\n\tpkey 0\n\tspkey 0\n\tvolup 0\n\tvoldn 0\n\tsresn 0\t\n\n\tfssel 0\n\tjtagsel 0\n\tuartsel 0\n\tusbsel 0\n\tpedl 0\n\tsedl 0\n\n\tlogComment ====== powerOff finish ======\n\ndef fpowerOn()\n\tlogComment ====== fpowerOn start ======\n\n\tpowerOff\n\t\n\tfssel 0\n\tjtagsel 0\n\tuartsel 0\n\tusbsel 0\n\t\n\tpowerOnTheDevice\n\n\tpkey 1\n\tdelay 800\n\tpkey 0\n\n\tlogComment ====== fpowerOn finish ======\n\ndef spowerOn()\n\tlogComment ====== spowerOn start ======\n\n\tpowerOff\n\t\n\tfssel 1\n\tjtagsel 1\n\tuartsel 1\n\tusbsel 1\n\t\n\tpowerOnTheDevice\n\n\tspkey 1\n\tdelay 800\n\tspkey 0\n\n\tlogComment ====== spowerOn finish ======\n\ndef bootToAPQEDL()\n\tlogComment ====== bootToAPQEDL start ======\n\n\tpowerOffTheDevice\n\n\tpkey 0\n\tvolup 0\n\tvoldn 0\n\n\tpedl 1\n\n\tpowerOnTheDevice\n\n\tpkey 1\n\tdelay 1300\n\tpkey 0\n\n\tpedl 0\n\n\tlogComment ====== bootToAPQEDL finish ======\n\n\ndef bootToSDXEDL()\n\tlogComment ====== bootToSDXEDL start ======\n\n\tpowerOffTheDevice\n\n\tspkey 0\n\t//sresn 0\n\n\tfssel 1\n\tjtagsel 1\n\tuartsel 1\n\tusbsel 1\n\tsedl 1\n\n\tpowerOnTheDevice\n\n\tspkey 1\n\tdelay 1500\n\tspkey 0\n\n\tsedl 0\n\n\tlogComment ====== bootToSDXEDL finish ======\n\n\ndef bootToUEFI()\n\tlogComment ====== bootToUEFIMenu start ======\n\n\tpowerOffTheDevice\n\n\t// Put buttons in a set state\n\tpkey 0\n\tvolup 1\n\tvoldn 0\n\n\tpedl 0\n\n\tpowerOnTheDevice\n\n\tpkey 1\n\tdelay 8000\n\tpkey 0\n\tvolup 0\n\tdelay 12\n\tpkey 1\n\n\tpkey 0\n\tvolup 0\n\n\tlogComment ====== bootToUEFIMenu finish ======\n\ndef bootToFastboot()\n\tlogComment ====== bootToFastboot start ======\n\n\tpowerOffTheDevice\n\n\tpkey 0\n\tvolup 0\n\tvoldn 1\n\n\tpedl 0\n\n\tpowerOnTheDevice\n\n\tpkey 1\n\tdelay 800\n\tpkey 0\n\n\tdelay 1500\n\tvoldn 0\n\tdelay 30\n\tvoldn 1\n\n\tvoldn 0\n\n\tlogComment ====== bootToFastboot finished ======\n", "usb_descriptor": "ALPACA-LITE SDX_FUS_ATP", "pins": [ { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "0", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "0", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "pshold", "initial_value": false, "input": false, "inverted": false, "pin_number": "0", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "volup", "initial_value": false, "input": false, "inverted": false, "pin_number": "0", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "1", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "1", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "sresn", "initial_value": false, "input": false, "inverted": false, "pin_number": "1", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "power", "initial_value": false, "input": false, "inverted": true, "pin_number": "1", "priority": 2 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "2", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "2", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "sedl", "initial_value": false, "input": false, "inverted": false, "pin_number": "2", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "voldn", "initial_value": false, "input": false, "inverted": false, "pin_number": "2", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "3", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "3", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "jtagsel", "initial_value": false, "input": false, "inverted": false, "pin_number": "3", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "pkey", "initial_value": false, "input": false, "inverted": false, "pin_number": "3", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "4", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "4", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "uartsel", "initial_value": false, "input": false, "inverted": false, "pin_number": "4", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "spkey", "initial_value": false, "input": false, "inverted": false, "pin_number": "4", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "5", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "5", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "softpdn", "initial_value": false, "input": false, "inverted": false, "pin_number": "5", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "pedl", "initial_value": false, "input": false, "inverted": false, "pin_number": "5", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "6", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "6", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "usbsel", "initial_value": false, "input": false, "inverted": false, "pin_number": "6", "priority": 2 }, { "bus": "D", "chip_index": 0, "command": "fssel", "initial_value": false, "input": false, "inverted": false, "pin_number": "6", "priority": 1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "7", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "7", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "tcready", "initial_value": false, "input": false, "inverted": false, "pin_number": "7", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "usb0", "initial_value": false, "input": false, "inverted": true, "pin_number": "7", "priority": 2 } ], "variables": [] } pytactl-3.2/pytactl/tac_configs/TAC_FTDI_42.pinout.json000066400000000000000000000165261526550266300227530ustar00rootroot00000000000000{ "$schema": "https://qualcomm.github.io/tac/schemas/pinout-1.0.json", "format": "tac-pinout", "schema_version": "1.0", "source": { "repository": "https://github.com/qualcomm/qcom-test-automation-controller.git", "commit": "757cc972c88e4a1098881b2bc73f3d53eac286be", "path": "configurations", "file": "TAC_FTDI_42.tcnf" }, "bus": [ { "bus": "A", "bus_function": 1, "chip_index": 0 }, { "bus": "B", "bus_function": 1, "chip_index": 0 }, { "bus": "C", "bus_function": 1, "chip_index": 0 }, { "bus": "D", "bus_function": 2, "chip_index": 0 } ], "chip_count": 1, "description": "ALPACA-LITE SMART LABEL", "name": "ALPACA-LITE SMART LABEL", "platform_id": 42, "platform_type": "FTDI", "reset_enabled": false, "script": "", "usb_descriptor": "ALPACA-LITE SMART LABEL", "pins": [ { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "0", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "0", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "SoCWakeUp", "initial_value": false, "input": false, "inverted": false, "pin_number": "0", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "1", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "1", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "TESICMODE2", "initial_value": false, "input": false, "inverted": false, "pin_number": "1", "priority": 2 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "2", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "2", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "QCXRESIN", "initial_value": false, "input": false, "inverted": false, "pin_number": "2", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "3", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "3", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "pkey", "initial_value": false, "input": false, "inverted": false, "pin_number": "3", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "4", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "4", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "TESICMODE0", "initial_value": false, "input": false, "inverted": false, "pin_number": "4", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "5", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "5", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "TESICMODE1", "initial_value": false, "input": false, "inverted": false, "pin_number": "5", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "6", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "6", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "", "initial_value": true, "input": false, "inverted": false, "pin_number": "6", "priority": 1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "7", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "7", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "MUXSEL", "initial_value": false, "input": false, "inverted": false, "pin_number": "7", "priority": 2 } ], "variables": [] } pytactl-3.2/pytactl/tac_configs/TAC_FTDI_45.pinout.json000066400000000000000000000235051526550266300227510ustar00rootroot00000000000000{ "$schema": "https://qualcomm.github.io/tac/schemas/pinout-1.0.json", "format": "tac-pinout", "schema_version": "1.0", "source": { "repository": "https://github.com/qualcomm/qcom-test-automation-controller.git", "commit": "757cc972c88e4a1098881b2bc73f3d53eac286be", "path": "configurations", "file": "TAC_FTDI_45.tcnf" }, "bus": [ { "bus": "A", "bus_function": 1, "chip_index": 0 }, { "bus": "B", "bus_function": 1, "chip_index": 0 }, { "bus": "C", "bus_function": 2, "chip_index": 0 }, { "bus": "D", "bus_function": 2, "chip_index": 0 } ], "chip_count": 1, "description": "Glymur SIP V2 Alpaca Lite", "name": "Glymur SIP Lite", "platform_id": 45, "platform_type": "FTDI", "reset_enabled": false, "script": "def powerOffTheDevice() \n\tlogComment ====== powerOffTheDevice sequence start ======\n\n\tbattery 1\n\tusb0 1\n\tusb1 1\n\n\tlogComment ====== powerOffTheDevice sequence finish ======\n\ndef powerOnTheDevice()\n\tlogComment ====== powerOnTheDevice sequence start ======\n\n\tdelay 500\n\tbattery 0\n\tdelay 900\n\tusb0 0\n\tusb1 0\n\tdelay 30\n\n\tlogComment ====== powerOnTheDevice sequence finish ======\n\ndef powerOff()\n\tlogComment ====== powerOff start ======\n\n\tpowerOffTheDevice\n\n\tpkey 0\n\tvolup 0\n\tvoldn 0\n\n\tpedl 0\n\n\tlogComment ====== powerOff finish ======\n\ndef powerOn()\n\tlogComment ====== powerOn start ======\n\n\tpowerOff\n\n\tpowerOnTheDevice\n\n\tpkey 1\n\tdelay 800\n\tpkey 0\n\n\tlogComment ====== powerOn finish ======\n\ndef bootToEDL()\n\tlogComment ====== bootToEDL start ======\n\n\tpowerOffTheDevice\n\n\tpkey 0\n\tvolup 0\n\tvoldn 0\n\n\tpedl 1\n\n\tpowerOnTheDevice\n\n\tpkey 1\n\tdelay $edl\n\tpkey 0\n\n\tpedl 0\n\n\tlogComment ====== bootToEDL finish ======\n\ndef bootToSecondaryEDL()\n\tlogComment ====== bootToSecondaryEDL start ======\n\n\tpowerOffTheDevice\n\n\tpkey 0\n\tvolup 0\n\tvoldn 0\n\n\tsedl 1\n\n\tpowerOnTheDevice\n\n\tpkey 1\n\tdelay 800\n\tpkey 0\n\n\tdelay 1300\n\n\tsedl 0\n\n\tlogComment ====== bootToSecondaryEDL finish ======\n\ndef bootToUEFI()\n\tlogComment ====== bootToUEFIMenu start ======\n\n\tpowerOffTheDevice\n\n\t// Put buttons in a set state\n\tpkey 0\n\tvolup 0\n\tvoldn 0\n\n\tpedl 0\n\n\tpowerOnTheDevice\n\tdelay $uefi\n\tpkey 1\n\tvolup 1\n\t\n\tdelay 4000\n\tpkey 0\n\tvolup 0\n\n\tlogComment ====== bootToUEFIMenu finish ======\n\ndef bootToFastboot()\n\tlogComment ====== bootToFastboot start ======\n\n\tpowerOffTheDevice\n\n\tpkey 0\n\tvolup 0\n\tvoldn 1\n\n\tpedl 0\n\n\tpowerOnTheDevice\n\n\tpkey 1\n\tdelay 800\n\tpkey 0\n\n\tdelay $fastboot\n\tvoldn 0\n\tdelay 30\n\tvoldn 1\n\n\tvoldn 0\n\n\tlogComment ====== bootToFastboot finished ======\n\ndef DisUSBVbus() \n\tlogComment ====== DisUSBVbus sequence start ======\n\n\tusb0 1\n\tusb1 1\n\n\tlogComment ====== DisUSBVbus sequence finish ======\n\ndef EnUSBVbus() \n\tlogComment ====== EnUSBVbus sequence start ======\n\n\tusb0 0\n\tusb1 0\n\n\tlogComment ====== EnUSBVbus sequence finish ======\n\ndef bootRCMToEDL()\n\tlogComment ====== bootToEDL start ======\n\n\tpedl 1\n\tdelay 18000\n\tvoldn 1\n\tdelay $rcmedl\n\tpedl 0\n\tvoldn 0\n\n\tlogComment ====== bootRCMToEDL finish ======\n", "usb_descriptor": "ALPACA-LITE SIP12 QCB8480X GLYMUR", "pins": [ { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "0", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "pshold", "initial_value": false, "input": false, "inverted": false, "pin_number": "0", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "volup", "initial_value": false, "input": false, "inverted": false, "pin_number": "0", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "1", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "1", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "battery", "initial_value": false, "input": false, "inverted": true, "pin_number": "1", "priority": 2 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "2", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "2", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "voldn", "initial_value": false, "input": false, "inverted": false, "pin_number": "2", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "3", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "3", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "pkey", "initial_value": false, "input": false, "inverted": false, "pin_number": "3", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "4", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "sdcard", "initial_value": false, "input": false, "inverted": false, "pin_number": "4", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "eud", "initial_value": false, "input": false, "inverted": false, "pin_number": "4", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "5", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "5", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "pedl", "initial_value": false, "input": false, "inverted": false, "pin_number": "5", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "6", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "usb1", "initial_value": false, "input": false, "inverted": true, "pin_number": "6", "priority": 2 }, { "bus": "D", "chip_index": 0, "command": "", "initial_value": true, "input": false, "inverted": false, "pin_number": "6", "priority": 1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "7", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "sresn", "initial_value": false, "input": false, "inverted": false, "pin_number": "7", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "usb0", "initial_value": false, "input": false, "inverted": false, "pin_number": "7", "priority": 2 } ], "variables": [ { "default_value": "1300", "name": "edl" }, { "default_value": "8000", "name": "fastboot" }, { "default_value": "17000", "name": "rcmedl" }, { "default_value": "500", "name": "uefi" } ] } pytactl-3.2/pytactl/tac_configs/TAC_FTDI_48.pinout.json000066400000000000000000000272151526550266300227560ustar00rootroot00000000000000{ "$schema": "https://qualcomm.github.io/tac/schemas/pinout-1.0.json", "format": "tac-pinout", "schema_version": "1.0", "source": { "repository": "https://github.com/qualcomm/qcom-test-automation-controller.git", "commit": "757cc972c88e4a1098881b2bc73f3d53eac286be", "path": "configurations", "file": "TAC_FTDI_48.tcnf" }, "bus": [ { "bus": "A", "bus_function": 1, "chip_index": 0 }, { "bus": "B", "bus_function": 1, "chip_index": 0 }, { "bus": "C", "bus_function": 2, "chip_index": 0 }, { "bus": "D", "bus_function": 2, "chip_index": 0 } ], "chip_count": 1, "description": "MTP8850 FTDI IO", "name": "Kaanapali MTP", "platform_id": 48, "platform_type": "FTDI", "reset_enabled": false, "script": "def powerOffTheDevice() \n\tlogComment ====== powerOffTheDevice sequence start ======\n\n\tbattery 1\n\tusb0 1\n\tusb1 1\n\n\tlogComment ====== powerOffTheDevice sequence finish ======\n\ndef powerOnTheDevice()\n\tlogComment ====== powerOnTheDevice sequence start ======\n\n\tdelay 500\n\tbattery 0\n\tdelay 900\n\tusb0 0\n\tusb1 0\n\tdelay 30\n\n\tlogComment ====== powerOnTheDevice sequence finish ======\n\ndef powerOff()\n\tlogComment ====== powerOff start ======\n\n\tpowerOffTheDevice\n\n\tpkey 0\n\tvolup 0\n\tvoldn 0\n\n\tpedl 0\n\n\tlogComment ====== powerOff finish ======\n\ndef powerOn()\n\tlogComment ====== powerOn start ======\n\n\tpowerOff\n\n\tpowerOnTheDevice\n\n\tpkey 1\n\tdelay 800\n\tpkey 0\n\n\tlogComment ====== powerOn finish ======\n\ndef bootToEDL()\n\tlogComment ====== bootToEDL start ======\n\n\tpowerOffTheDevice\n\n\tpkey 0\n\tvolup 0\n\tvoldn 0\n\n\tpedl 1\n\n\tpowerOnTheDevice\n\n\tpkey 1\n\tdelay 1300\n\tpkey 0\n\n\tpedl 0\n\n\tlogComment ====== bootToEDL finish ======\n\ndef bootToSecondaryEDL()\n\tlogComment ====== bootToSecondaryEDL start ======\n\n\tpowerOffTheDevice\n\n\tpkey 0\n\tvolup 0\n\tvoldn 0\n\n\tsedl 1\n\n\tpowerOnTheDevice\n\n\tpkey 1\n\tdelay 800\n\tpkey 0\n\n\tdelay 1300\n\n\tsedl 0\n\n\tlogComment ====== bootToSecondaryEDL finish ======\n\ndef bootToBatteryEDL()\n\tlogComment ====== bootToBatteryEDL start ======\n\t\n\tpedl 1 //set EDL high\n\tvoldn 1 //reset MTP after 115 seconds\n\tdelay 14000\n\n\tpkey 1\n\tdelay 1300\n\tpkey 0\n\t\n\t//reset buttons\n\tdelay 6000\n\tvoldn 0 \n\tpedl 0\n\n\tlogComment ====== bootToBatteryEDL finish ======\n\ndef bootToUEFI()\n\tlogComment ====== bootToUEFIMenu start ======\n\n\tpowerOffTheDevice\n\n\t// Put buttons in a set state\n\tpkey 0\n\tvolup 1\n\tvoldn 0\n\n\tpedl 0\n\n\tpowerOnTheDevice\n\tdelay 1500 //requires at least 700ms for pd controller negotiation\n\tpkey 1\n\tdelay 8000\n\tpkey 0\n\tvolup 0\n\tdelay 12\n\tpkey 1\n\tvolup 1\n\n\tpkey 0\n\tvolup 0\n\n\tlogComment ====== bootToUEFIMenu finish ======\n\ndef bootToFastboot()\n\tlogComment ====== bootToFastboot start ======\n\n\tpowerOffTheDevice\n\n\tpkey 0\n\tvolup 0\n\tvoldn 1\n\n\tpedl 0\n\n\tpowerOnTheDevice\n\n\tpkey 1\n\tdelay 2000\n\tpkey 0\n\n\tdelay 6000\n\tvoldn 0\n\tdelay 30\n\tvoldn 1\n\n\tvoldn 0\n\n\tlogComment ====== bootToFastboot finished ======\n\ndef batteryReset()\n\tlogComment ====== batteryReset ======\n\t\n\tpedl 0 //reset EDL\n\tvoldn 1 //reset MTP after 14 seconds\n\tdelay 14000\n\n\tpkey 1\n\tdelay 1300\n\tpkey 0\n\n\tdelay 6000\n\tvoldn 0 //release voldn to stop MTP reset\n\n\tlogComment ====== batteryReset ======", "usb_descriptor": "ALPACA-LITE MTP8850", "pins": [ { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "0", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "0", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "pshold", "initial_value": false, "input": false, "inverted": false, "pin_number": "0", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "volup", "initial_value": false, "input": false, "inverted": false, "pin_number": "0", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "1", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "1", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "uim1", "initial_value": false, "input": false, "inverted": false, "pin_number": "1", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "battery", "initial_value": false, "input": false, "inverted": true, "pin_number": "1", "priority": 2 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "2", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "2", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "headset", "initial_value": false, "input": false, "inverted": false, "pin_number": "2", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "voldn", "initial_value": false, "input": false, "inverted": false, "pin_number": "2", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "3", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "3", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "uim2", "initial_value": false, "input": false, "inverted": false, "pin_number": "3", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "pkey", "initial_value": false, "input": false, "inverted": false, "pin_number": "3", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "4", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "4", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "sdcard", "initial_value": false, "input": false, "inverted": false, "pin_number": "4", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "eud", "initial_value": false, "input": false, "inverted": false, "pin_number": "4", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "5", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "5", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "sedl", "initial_value": false, "input": false, "inverted": false, "pin_number": "5", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "pedl", "initial_value": false, "input": false, "inverted": false, "pin_number": "5", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "6", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "6", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "usb1", "initial_value": false, "input": false, "inverted": true, "pin_number": "6", "priority": 2 }, { "bus": "D", "chip_index": 0, "command": "", "initial_value": true, "input": false, "inverted": false, "pin_number": "6", "priority": 1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "7", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "7", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "sresn", "initial_value": false, "input": false, "inverted": false, "pin_number": "7", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "usb0", "initial_value": false, "input": false, "inverted": true, "pin_number": "7", "priority": 2 } ], "variables": [] } pytactl-3.2/pytactl/tac_configs/TAC_FTDI_49.pinout.json000066400000000000000000000264441526550266300227620ustar00rootroot00000000000000{ "$schema": "https://qualcomm.github.io/tac/schemas/pinout-1.0.json", "format": "tac-pinout", "schema_version": "1.0", "source": { "repository": "https://github.com/qualcomm/qcom-test-automation-controller.git", "commit": "757cc972c88e4a1098881b2bc73f3d53eac286be", "path": "configurations", "file": "TAC_FTDI_49.tcnf" }, "bus": [ { "bus": "A", "bus_function": 1, "chip_index": 0 }, { "bus": "B", "bus_function": 1, "chip_index": 0 }, { "bus": "C", "bus_function": 2, "chip_index": 0 }, { "bus": "D", "bus_function": 2, "chip_index": 0 } ], "chip_count": 1, "description": "Glymur COB CDPS", "name": "Glymur COB CDPS", "platform_id": 49, "platform_type": "FTDI", "reset_enabled": false, "script": "def powerOffTheDevice() \r\n\tlogComment ====== powerOffTheDevice sequence start ======\r\n\r\n\tbattery 1\r\n\tusb0 1\r\n\tusb1 1\r\n\r\n\tlogComment ====== powerOffTheDevice sequence finish ======\r\n\r\ndef powerOnTheDevice()\r\n\tlogComment ====== powerOnTheDevice sequence start ======\r\n\r\n\tdelay 500\r\n\tbattery 0\r\n\tdelay 900\r\n\tusb0 0\r\n\tusb1 0\r\n\tdelay 30\r\n\r\n\tlogComment ====== powerOnTheDevice sequence finish ======\r\n\r\ndef powerOff()\r\n\tlogComment ====== powerOff start ======\r\n\r\n\tpowerOffTheDevice\r\n\r\n\tpkey 0\r\n\tvolup 0\r\n\tvoldn 0\r\n\r\n\tpedl 0\r\n\r\n\tlogComment ====== powerOff finish ======\r\n\r\ndef powerOn()\r\n\tlogComment ====== powerOn start ======\r\n\r\n\tpowerOff\r\n\r\n\tpowerOnTheDevice\r\n\r\n\tpkey 1\r\n\tdelay 800\r\n\tpkey 0\r\n\r\n\tlogComment ====== powerOn finish ======\r\n\r\ndef bootToEDL()\r\n\tlogComment ====== bootToEDL start ======\r\n\r\n\tpowerOffTheDevice\r\n\r\n\tpkey 0\r\n\tvolup 0\r\n\tvoldn 0\r\n\r\n\tpedl 1\r\n\r\n\tpowerOnTheDevice\r\n\r\n\tpkey 1\r\n\tdelay $edl\r\n\tpkey 0\r\n\r\n\tpedl 0\r\n\r\n\tlogComment ====== bootToEDL finish ======\r\n\r\ndef bootToSecondaryEDL()\r\n\tlogComment ====== bootToSecondaryEDL start ======\r\n\r\n\tpowerOffTheDevice\r\n\r\n\tpkey 0\r\n\tvolup 0\r\n\tvoldn 0\r\n\r\n\tsedl 1\r\n\r\n\tpowerOnTheDevice\r\n\r\n\tpkey 1\r\n\tdelay 800\r\n\tpkey 0\r\n\r\n\tdelay 1300\r\n\r\n\tsedl 0\r\n\r\n\tlogComment ====== bootToSecondaryEDL finish ======\r\n\r\ndef bootToUEFI()\r\n\tlogComment ====== bootToUEFIMenu start ======\r\n\r\n\tpowerOffTheDevice\r\n\r\n\t// Put buttons in a set state\r\n\tpkey 0\r\n\tvolup 1\r\n\tvoldn 0\r\n\r\n\tpedl 0\r\n\r\n\tpowerOnTheDevice\r\n\r\n\tpkey 1\r\n\tdelay $uefi\r\n\tpkey 0\r\n\tvolup 0\r\n\tdelay 12\r\n\tpkey 1\r\n\tvolup 1\r\n\r\n\tpkey 0\r\n\tvolup 0\r\n\r\n\tlogComment ====== bootToUEFIMenu finish ======\r\n\r\ndef bootToFastboot()\r\n\tlogComment ====== bootToFastboot start ======\r\n\r\n\tpowerOffTheDevice\r\n\r\n\tpkey 0\r\n\tvolup 0\r\n\tvoldn 1\r\n\r\n\tpedl 0\r\n\r\n\tpowerOnTheDevice\r\n\r\n\tpkey 1\r\n\tdelay 800\r\n\tpkey 0\r\n\r\n\tdelay $fastboot\r\n\tvoldn 0\r\n\tdelay 30\r\n\tvoldn 1\r\n\r\n\tvoldn 0\r\n\r\n\tlogComment ====== bootToFastboot finished ======\r\n", "usb_descriptor": "ALPACA-LITE GLYMUR COB CDPS", "pins": [ { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "0", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "0", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "pshold", "initial_value": false, "input": false, "inverted": false, "pin_number": "0", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "volup", "initial_value": false, "input": false, "inverted": false, "pin_number": "0", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "1", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "1", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "mode0", "initial_value": false, "input": false, "inverted": false, "pin_number": "1", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "battery", "initial_value": false, "input": false, "inverted": true, "pin_number": "1", "priority": 2 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "2", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "2", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "gg2", "initial_value": false, "input": false, "inverted": false, "pin_number": "2", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "3", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "3", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "mode1", "initial_value": false, "input": false, "inverted": false, "pin_number": "3", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "pkey", "initial_value": false, "input": false, "inverted": false, "pin_number": "3", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "4", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "4", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "sdcard", "initial_value": false, "input": false, "inverted": false, "pin_number": "4", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "eud", "initial_value": false, "input": false, "inverted": false, "pin_number": "4", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "5", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "5", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "gg1", "initial_value": false, "input": false, "inverted": false, "pin_number": "5", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "pedl", "initial_value": false, "input": false, "inverted": false, "pin_number": "5", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "6", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "6", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "usb1", "initial_value": false, "input": false, "inverted": true, "pin_number": "6", "priority": 2 }, { "bus": "D", "chip_index": 0, "command": "", "initial_value": true, "input": false, "inverted": false, "pin_number": "6", "priority": 1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "7", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "7", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "voldn", "initial_value": false, "input": false, "inverted": false, "pin_number": "7", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "usb0", "initial_value": false, "input": false, "inverted": true, "pin_number": "7", "priority": 2 } ], "variables": [ { "default_value": "1300", "name": "edl" }, { "default_value": "8000", "name": "fastboot" }, { "default_value": "8000", "name": "uefi" } ] } pytactl-3.2/pytactl/tac_configs/TAC_FTDI_51.pinout.json000066400000000000000000000264621526550266300227530ustar00rootroot00000000000000{ "$schema": "https://qualcomm.github.io/tac/schemas/pinout-1.0.json", "format": "tac-pinout", "schema_version": "1.0", "source": { "repository": "https://github.com/qualcomm/qcom-test-automation-controller.git", "commit": "757cc972c88e4a1098881b2bc73f3d53eac286be", "path": "configurations", "file": "TAC_FTDI_51.tcnf" }, "bus": [ { "bus": "A", "bus_function": 1, "chip_index": 0 }, { "bus": "B", "bus_function": 1, "chip_index": 0 }, { "bus": "C", "bus_function": 2, "chip_index": 0 }, { "bus": "D", "bus_function": 2, "chip_index": 0 } ], "chip_count": 1, "description": "ALPACA-LITE GLYMUR COB QCB", "name": "Glymur CoB QCB", "platform_id": 51, "platform_type": "FTDI", "reset_enabled": false, "script": "def powerOffTheDevice() \n\tlogComment ====== powerOffTheDevice sequence start ======\n\n\tbattery 1\n\tusb0 1\n\tusb1 1\n\tusb3456 1\n\n\tlogComment ====== powerOffTheDevice sequence finish ======\n\ndef powerOnTheDevice()\n\tlogComment ====== powerOnTheDevice sequence start ======\n\n\tdelay 500\n\tbattery 0\n\tdelay 900\n\tusb0 0\n\tusb1 0\n\tusb3456 0\n\tdelay 30\n\n\tlogComment ====== powerOnTheDevice sequence finish ======\n\ndef powerOff()\n\tlogComment ====== powerOff start ======\n\n\tpowerOffTheDevice\n\n\tpkey 0\n\tvolup 0\n\tvoldn 0\n\n\tpedl 0\n\n\tlogComment ====== powerOff finish ======\n\ndef powerOn()\n\tlogComment ====== powerOn start ======\n\n\tpowerOff\n\n\tpowerOnTheDevice\n\n\tpkey 1\n\tdelay 800\n\tpkey 0\n\n\tlogComment ====== powerOn finish ======\n\ndef bootToEDL()\n\tlogComment ====== bootToEDL start ======\n\n\tpowerOffTheDevice\n\n\tpkey 0\n\tvolup 0\n\tvoldn 0\n\n\tpedl 1\n\n\tpowerOnTheDevice\n\n\tpkey 1\n\tdelay $edl\n\tpkey 0\n\n\tpedl 0\n\n\tlogComment ====== bootToEDL finish ======\n\ndef bootToSecondaryEDL()\n\tlogComment ====== bootToSecondaryEDL start ======\n\n\tpowerOffTheDevice\n\n\tpkey 0\n\tvolup 0\n\tvoldn 0\n\n\tsedl 1\n\n\tpowerOnTheDevice\n\n\tpkey 1\n\tdelay 800\n\tpkey 0\n\n\tdelay 1300\n\n\tsedl 0\n\n\tlogComment ====== bootToSecondaryEDL finish ======\n\ndef bootToUEFI()\n\tlogComment ====== bootToUEFIMenu start ======\n\n\tpowerOffTheDevice\n\n\t// Put buttons in a set state\n\tpkey 0\n\tvolup 1\n\tvoldn 0\n\n\tpedl 0\n\n\tpowerOnTheDevice\n\n\tpkey 1\n\tdelay $uefi\n\tpkey 0\n\tvolup 0\n\tdelay 12\n\tpkey 1\n\tvolup 1\n\n\tpkey 0\n\tvolup 0\n\n\tlogComment ====== bootToUEFIMenu finish ======\n\ndef bootToFastboot()\n\tlogComment ====== bootToFastboot start ======\n\n\tpowerOffTheDevice\n\n\tpkey 0\n\tvolup 0\n\tvoldn 1\n\n\tpedl 0\n\n\tpowerOnTheDevice\n\n\tpkey 1\n\tdelay 800\n\tpkey 0\n\n\tdelay $fastboot\n\tvoldn 0\n\tdelay 30\n\tvoldn 1\n\n\tvoldn 0\n\n\tlogComment ====== bootToFastboot finished ======\n", "usb_descriptor": "ALPACA-LITE GLYMUR COB QCB", "pins": [ { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "0", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "0", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "pshold", "initial_value": false, "input": false, "inverted": false, "pin_number": "0", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "volup", "initial_value": false, "input": false, "inverted": false, "pin_number": "0", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "1", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "1", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "uim1", "initial_value": false, "input": false, "inverted": false, "pin_number": "1", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "battery", "initial_value": false, "input": false, "inverted": true, "pin_number": "1", "priority": 2 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "2", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "2", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "usb3456", "initial_value": false, "input": false, "inverted": true, "pin_number": "2", "priority": 2 }, { "bus": "D", "chip_index": 0, "command": "voldn", "initial_value": false, "input": false, "inverted": false, "pin_number": "2", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "3", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "3", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "phybatt", "initial_value": false, "input": false, "inverted": false, "pin_number": "3", "priority": 2 }, { "bus": "D", "chip_index": 0, "command": "pkey", "initial_value": false, "input": false, "inverted": false, "pin_number": "3", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "4", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "4", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "sdcard", "initial_value": false, "input": false, "inverted": false, "pin_number": "4", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "eud", "initial_value": false, "input": false, "inverted": false, "pin_number": "4", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "5", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "5", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "bc1high", "initial_value": false, "input": false, "inverted": false, "pin_number": "5", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "pedl", "initial_value": false, "input": false, "inverted": false, "pin_number": "5", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "6", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "6", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "usb1", "initial_value": false, "input": false, "inverted": true, "pin_number": "6", "priority": 2 }, { "bus": "D", "chip_index": 0, "command": "", "initial_value": true, "input": false, "inverted": false, "pin_number": "6", "priority": 1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "7", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "7", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "sresn", "initial_value": false, "input": false, "inverted": false, "pin_number": "7", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "usb0", "initial_value": false, "input": false, "inverted": true, "pin_number": "7", "priority": 2 } ], "variables": [ { "default_value": "1300", "name": "edl" }, { "default_value": "8000", "name": "fastboot" }, { "default_value": "8000", "name": "uefi" } ] } pytactl-3.2/pytactl/tac_configs/TAC_FTDI_52.pinout.json000066400000000000000000000265121526550266300227500ustar00rootroot00000000000000{ "$schema": "https://qualcomm.github.io/tac/schemas/pinout-1.0.json", "format": "tac-pinout", "schema_version": "1.0", "source": { "repository": "https://github.com/qualcomm/qcom-test-automation-controller.git", "commit": "757cc972c88e4a1098881b2bc73f3d53eac286be", "path": "configurations", "file": "TAC_FTDI_52.tcnf" }, "bus": [ { "bus": "A", "bus_function": 1, "chip_index": 0 }, { "bus": "B", "bus_function": 1, "chip_index": 0 }, { "bus": "C", "bus_function": 2, "chip_index": 0 }, { "bus": "D", "bus_function": 2, "chip_index": 0 } ], "chip_count": 1, "description": "Glymur QCB V1 Alpaca Lite With battery", "name": "Glymur CoB QCB WITH BATTERY", "platform_id": 52, "platform_type": "FTDI", "reset_enabled": false, "script": "def powerOffTheDevice() \n\tlogComment ====== powerOffTheDevice sequence start ======\n\n\tbattery 0\n\tusb0 1\n\tusb1 1\n\tusb3456 1\n\n\tlogComment ====== powerOffTheDevice sequence finish ======\n\ndef powerOnTheDevice()\n\tlogComment ====== powerOnTheDevice sequence start ======\n\n\tdelay 500\n\tbattery 1\n\tdelay 900\n\tusb0 0\n\tusb1 0\n\tusb3456 0\n\tdelay 30\n\n\tlogComment ====== powerOnTheDevice sequence finish ======\n\ndef powerOff()\n\tlogComment ====== powerOff start ======\n\n\tpowerOffTheDevice\n\n\tpkey 0\n\tvolup 0\n\tvoldn 0\n\n\tpedl 0\n\n\tlogComment ====== powerOff finish ======\n\ndef powerOn()\n\tlogComment ====== powerOn start ======\n\n\tpowerOff\n\n\tpowerOnTheDevice\n\n\tpkey 1\n\tdelay 800\n\tpkey 0\n\n\tlogComment ====== powerOn finish ======\n\ndef bootToEDL()\n\tlogComment ====== bootToEDL start ======\n\n\tpowerOffTheDevice\n\n\tpkey 0\n\tvolup 0\n\tvoldn 0\n\n\tpedl 1\n\n\tpowerOnTheDevice\n\n\tpkey 1\n\tdelay $edl\n\tpkey 0\n\n\tpedl 0\n\n\tlogComment ====== bootToEDL finish ======\n\ndef bootToSecondaryEDL()\n\tlogComment ====== bootToSecondaryEDL start ======\n\n\tpowerOffTheDevice\n\n\tpkey 0\n\tvolup 0\n\tvoldn 0\n\n\tsedl 1\n\n\tpowerOnTheDevice\n\n\tpkey 1\n\tdelay 800\n\tpkey 0\n\n\tdelay 1300\n\n\tsedl 0\n\n\tlogComment ====== bootToSecondaryEDL finish ======\n\ndef bootToUEFI()\n\tlogComment ====== bootToUEFIMenu start ======\n\n\tpowerOffTheDevice\n\n\t// Put buttons in a set state\n\tpkey 0\n\tvolup 1\n\tvoldn 0\n\n\tpedl 0\n\n\tpowerOnTheDevice\n\n\tpkey 1\n\tdelay $uefi\n\tpkey 0\n\tvolup 0\n\tdelay 12\n\tpkey 1\n\tvolup 1\n\n\tpkey 0\n\tvolup 0\n\n\tlogComment ====== bootToUEFIMenu finish ======\n\ndef bootToFastboot()\n\tlogComment ====== bootToFastboot start ======\n\n\tpowerOffTheDevice\n\n\tpkey 0\n\tvolup 0\n\tvoldn 1\n\n\tpedl 0\n\n\tpowerOnTheDevice\n\n\tpkey 1\n\tdelay 800\n\tpkey 0\n\n\tdelay $fastboot\n\tvoldn 0\n\tdelay 30\n\tvoldn 1\n\n\tvoldn 0\n\n\tlogComment ====== bootToFastboot finished ======\n", "usb_descriptor": "ALPACA-LITE GLYMUR COB QCB BATT", "pins": [ { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "0", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "0", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "pshold", "initial_value": false, "input": false, "inverted": false, "pin_number": "0", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "volup", "initial_value": false, "input": false, "inverted": false, "pin_number": "0", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "1", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "1", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "uim1", "initial_value": false, "input": false, "inverted": false, "pin_number": "1", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "1", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "2", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "2", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "usb3456", "initial_value": false, "input": false, "inverted": true, "pin_number": "2", "priority": 2 }, { "bus": "D", "chip_index": 0, "command": "voldn", "initial_value": false, "input": false, "inverted": false, "pin_number": "2", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "3", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "3", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "battery", "initial_value": true, "input": false, "inverted": false, "pin_number": "3", "priority": 2 }, { "bus": "D", "chip_index": 0, "command": "pkey", "initial_value": false, "input": false, "inverted": false, "pin_number": "3", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "4", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "4", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "sdcard", "initial_value": false, "input": false, "inverted": false, "pin_number": "4", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "eud", "initial_value": false, "input": false, "inverted": false, "pin_number": "4", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "5", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "5", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "bc1high", "initial_value": false, "input": false, "inverted": false, "pin_number": "5", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "pedl", "initial_value": false, "input": false, "inverted": false, "pin_number": "5", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "6", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "6", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "usb1", "initial_value": false, "input": false, "inverted": true, "pin_number": "6", "priority": 2 }, { "bus": "D", "chip_index": 0, "command": "", "initial_value": true, "input": false, "inverted": false, "pin_number": "6", "priority": 1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "7", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "7", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "sresn", "initial_value": false, "input": false, "inverted": false, "pin_number": "7", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "usb0", "initial_value": false, "input": false, "inverted": true, "pin_number": "7", "priority": 2 } ], "variables": [ { "default_value": "1300", "name": "edl" }, { "default_value": "8000", "name": "fastboot" }, { "default_value": "8000", "name": "uefi" } ] } pytactl-3.2/pytactl/tac_configs/TAC_FTDI_55.pinout.json000066400000000000000000000264211526550266300227520ustar00rootroot00000000000000{ "$schema": "https://qualcomm.github.io/tac/schemas/pinout-1.0.json", "format": "tac-pinout", "schema_version": "1.0", "source": { "repository": "https://github.com/qualcomm/qcom-test-automation-controller.git", "commit": "757cc972c88e4a1098881b2bc73f3d53eac286be", "path": "configurations", "file": "TAC_FTDI_55.tcnf" }, "bus": [ { "bus": "A", "bus_function": 1, "chip_index": 0 }, { "bus": "B", "bus_function": 1, "chip_index": 0 }, { "bus": "C", "bus_function": 2, "chip_index": 0 }, { "bus": "D", "bus_function": 2, "chip_index": 0 } ], "chip_count": 1, "description": "AR TAC config for Balsam", "name": "Balsam SAR2230P", "platform_id": 55, "platform_type": "FTDI", "reset_enabled": false, "script": "def powerOffTheDevice() \n\tlogComment ====== powerOffTheDevice sequence start ======\n\n\tbattery 1\n\tusb0 1\n\tusb1 1\n\n\tlogComment ====== powerOffTheDevice sequence finish ======\n\ndef powerOnTheDevice()\n\tlogComment ====== powerOnTheDevice sequence start ======\n\n\tdelay 500\n\tbattery 0\n\tdelay 900\n\tusb0 0\n\tusb1 0\n\tdelay 30\n\n\tlogComment ====== powerOnTheDevice sequence finish ======\n\ndef powerOff()\n\tlogComment ====== powerOff start ======\n\n\tpowerOffTheDevice\n\n\tpkey 0\n\tvolup 0\n\tvoldn 0\n\n\tpedl 0\n\n\tlogComment ====== powerOff finish ======\n\ndef powerOn()\n\tlogComment ====== powerOn start ======\n\n\tpowerOff\n\n\tpowerOnTheDevice\n\n\tpkey 1\n\tdelay 800\n\tpkey 0\n\n\tlogComment ====== powerOn finish ======\n\ndef bootToEDL()\n\tlogComment ====== bootToEDL start ======\n\n\tpowerOffTheDevice\n\n\tpkey 0\n\tvolup 0\n\tvoldn 0\n\n\tpedl 1\n\n\tpowerOnTheDevice\n\n\tpkey 1\n\tdelay $edl\n\tpkey 0\n\n\tpedl 0\n\n\tlogComment ====== bootToEDL finish ======\n\ndef bootToSecondaryEDL()\n\tlogComment ====== bootToSecondaryEDL start ======\n\n\tpowerOffTheDevice\n\n\tpkey 0\n\tvolup 0\n\tvoldn 0\n\n\tsedl 1\n\n\tpowerOnTheDevice\n\n\tpkey 1\n\tdelay 800\n\tpkey 0\n\n\tdelay 1300\n\n\tsedl 0\n\n\tlogComment ====== bootToSecondaryEDL finish ======\n\ndef bootToUEFI()\n\tlogComment ====== bootToUEFIMenu start ======\n\n\tpowerOffTheDevice\n\n\t// Put buttons in a set state\n\tpkey 0\n\tvolup 1\n\tvoldn 0\n\n\tpedl 0\n\n\tpowerOnTheDevice\n\n\tpkey 1\n\tdelay $uefi\n\tpkey 0\n\tvolup 0\n\tdelay 12\n\tpkey 1\n\tvolup 1\n\n\tpkey 0\n\tvolup 0\n\n\tlogComment ====== bootToUEFIMenu finish ======\n\ndef bootToFastboot()\n\tlogComment ====== bootToFastboot start ======\n\n\tpowerOffTheDevice\n\n\tpkey 0\n\tvolup 0\n\tvoldn 1\n\n\tpedl 0\n\n\tpowerOnTheDevice\n\n\tpkey 1\n\tdelay 800\n\tpkey 0\n\n\tdelay $fastboot\n\tvoldn 0\n\tdelay 30\n\tvoldn 1\n\n\tvoldn 0\n\n\tlogComment ====== bootToFastboot finished ======\n", "usb_descriptor": "ALPACA-LITE FOR AR V1", "pins": [ { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "0", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "0", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "pshold", "initial_value": false, "input": false, "inverted": false, "pin_number": "0", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "volup", "initial_value": false, "input": false, "inverted": false, "pin_number": "0", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "1", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "1", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "back", "initial_value": false, "input": false, "inverted": false, "pin_number": "1", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "battery", "initial_value": false, "input": false, "inverted": true, "pin_number": "1", "priority": 2 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "2", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "2", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "pshold", "initial_value": false, "input": false, "inverted": false, "pin_number": "2", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "voldn", "initial_value": false, "input": false, "inverted": false, "pin_number": "2", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "3", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "3", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "rcmmarker0", "initial_value": false, "input": false, "inverted": false, "pin_number": "3", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "pkey", "initial_value": false, "input": false, "inverted": false, "pin_number": "3", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "4", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "4", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "eud", "initial_value": false, "input": false, "inverted": false, "pin_number": "4", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "eud", "initial_value": false, "input": false, "inverted": false, "pin_number": "4", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "5", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "5", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "sedl", "initial_value": false, "input": false, "inverted": false, "pin_number": "5", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "pedl", "initial_value": false, "input": false, "inverted": false, "pin_number": "5", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "6", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "6", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "usb1", "initial_value": false, "input": false, "inverted": true, "pin_number": "6", "priority": 2 }, { "bus": "D", "chip_index": 0, "command": "", "initial_value": true, "input": false, "inverted": false, "pin_number": "6", "priority": 1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "7", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "7", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "sresn", "initial_value": false, "input": false, "inverted": false, "pin_number": "7", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "usb0", "initial_value": false, "input": false, "inverted": true, "pin_number": "7", "priority": 2 } ], "variables": [ { "default_value": "1300", "name": "edl" }, { "default_value": "8000", "name": "fastboot" }, { "default_value": "8000", "name": "uefi" } ] } pytactl-3.2/pytactl/tac_configs/TAC_FTDI_56.pinout.json000066400000000000000000000260311526550266300227500ustar00rootroot00000000000000{ "$schema": "https://qualcomm.github.io/tac/schemas/pinout-1.0.json", "format": "tac-pinout", "schema_version": "1.0", "source": { "repository": "https://github.com/qualcomm/qcom-test-automation-controller.git", "commit": "757cc972c88e4a1098881b2bc73f3d53eac286be", "path": "configurations", "file": "TAC_FTDI_56.tcnf" }, "bus": [ { "bus": "A", "bus_function": 1, "chip_index": 0 }, { "bus": "B", "bus_function": 1, "chip_index": 0 }, { "bus": "C", "bus_function": 2, "chip_index": 0 }, { "bus": "D", "bus_function": 2, "chip_index": 0 } ], "chip_count": 1, "description": "MTP8845 FTDI IO", "name": "Molokai MTP", "platform_id": 56, "platform_type": "FTDI", "reset_enabled": false, "script": "def powerOffTheDevice() \n\tlogComment ====== powerOffTheDevice sequence start ======\n\n\tbattery 1\n\tusb0 1\n\tusb1 1\n\n\tlogComment ====== powerOffTheDevice sequence finish ======\n\ndef powerOnTheDevice()\n\tlogComment ====== powerOnTheDevice sequence start ======\n\n\tdelay 500\n\tbattery 0\n\tdelay 900\n\tusb0 0\n\tusb1 0\n\tdelay 30\n\n\tlogComment ====== powerOnTheDevice sequence finish ======\n\ndef powerOff()\n\tlogComment ====== powerOff start ======\n\n\tpowerOffTheDevice\n\n\tpkey 0\n\tvolup 0\n\tvoldn 0\n\n\tpedl 0\n\n\tlogComment ====== powerOff finish ======\n\ndef powerOn()\n\tlogComment ====== powerOn start ======\n\n\tpowerOff\n\n\tpowerOnTheDevice\n\n\tpkey 1\n\tdelay 800\n\tpkey 0\n\n\tlogComment ====== powerOn finish ======\n\ndef bootToEDL()\n\tlogComment ====== bootToEDL start ======\n\n\tpowerOffTheDevice\n\n\tpkey 0\n\tvolup 0\n\tvoldn 0\n\n\tpedl 1\n\n\tpowerOnTheDevice\n\n\tpkey 1\n\tdelay $edl\n\tpkey 0\n\n\tpedl 0\n\n\tlogComment ====== bootToEDL finish ======\n\ndef bootToUEFI()\n\tlogComment ====== bootToUEFIMenu start ======\n\n\tpowerOffTheDevice\n\n\t// Put buttons in a set state\n\tpkey 0\n\tvolup 1\n\tvoldn 0\n\n\tpedl 0\n\n\tpowerOnTheDevice\n\tdelay 1500 //requires at least 700ms for pd controller negotiation\n\tpkey 1\n\tdelay $uefi\n\tpkey 0\n\tvolup 0\n\tdelay 12\n\tpkey 1\n\tvolup 1\n\n\tpkey 0\n\tvolup 0\n\n\tlogComment ====== bootToUEFIMenu finish ======\n\ndef bootToFastboot()\n\tlogComment ====== bootToFastboot start ======\n\n\tpowerOffTheDevice\n\n\tpkey 0\n\tvolup 0\n\tvoldn 1\n\n\tpedl 0\n\n\tpowerOnTheDevice\n\n\tpkey 1\n\tdelay 2000\n\tpkey 0\n\n\tdelay $fastboot\n\tvoldn 0\n\tdelay 30\n\tvoldn 1\n\n\tvoldn 0\n\n\tlogComment ====== bootToFastboot finished ======", "usb_descriptor": "ALPACA-LITE MTP8845", "pins": [ { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "0", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "0", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "pshold", "initial_value": false, "input": false, "inverted": false, "pin_number": "0", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "volup", "initial_value": false, "input": false, "inverted": false, "pin_number": "0", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "1", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "1", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "uim1", "initial_value": false, "input": false, "inverted": false, "pin_number": "1", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "battery", "initial_value": false, "input": false, "inverted": true, "pin_number": "1", "priority": 2 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "2", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "2", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "headset", "initial_value": false, "input": false, "inverted": false, "pin_number": "2", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "voldn", "initial_value": false, "input": false, "inverted": false, "pin_number": "2", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "3", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "3", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "uim2", "initial_value": false, "input": false, "inverted": false, "pin_number": "3", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "pkey", "initial_value": false, "input": false, "inverted": false, "pin_number": "3", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "4", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "4", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "sdcard", "initial_value": false, "input": false, "inverted": false, "pin_number": "4", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "eud", "initial_value": false, "input": false, "inverted": false, "pin_number": "4", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "5", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "5", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "pshold_low", "initial_value": false, "input": false, "inverted": false, "pin_number": "5", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "pedl", "initial_value": false, "input": false, "inverted": false, "pin_number": "5", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "6", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "6", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "6", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "TC_READY_N", "initial_value": true, "input": false, "inverted": false, "pin_number": "6", "priority": 1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "7", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "7", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "7", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "usb0", "initial_value": false, "input": false, "inverted": true, "pin_number": "7", "priority": 2 } ], "variables": [ { "default_value": "1300", "name": "edl" }, { "default_value": "6000", "name": "fastboot" }, { "default_value": "8000", "name": "uefi" } ] } pytactl-3.2/pytactl/tac_configs/TAC_FTDI_60.pinout.json000066400000000000000000000242321526550266300227440ustar00rootroot00000000000000{ "$schema": "https://qualcomm.github.io/tac/schemas/pinout-1.0.json", "format": "tac-pinout", "schema_version": "1.0", "source": { "repository": "https://github.com/qualcomm/qcom-test-automation-controller.git", "commit": "757cc972c88e4a1098881b2bc73f3d53eac286be", "path": "configurations", "file": "TAC_FTDI_60.tcnf" }, "bus": [ { "bus": "A", "bus_function": 1, "chip_index": 0 }, { "bus": "B", "bus_function": 1, "chip_index": 0 }, { "bus": "C", "bus_function": 2, "chip_index": 0 }, { "bus": "D", "bus_function": 2, "chip_index": 0 } ], "chip_count": 1, "description": "Glymur Battery Enabled Device", "name": "Glymur Battery Enabled Device", "platform_id": 60, "platform_type": "FTDI", "reset_enabled": false, "script": "def reset() \n\tlogComment ====== reset sequence start ======\n\t\n\tusb0 1\n\tusb1 1\n\tpkey 0\n\tvolup 0\n\tvoldn 0\n\tpedl 0\n\tdelay 900\n\tusb0 0\n\tusb1 0\n\tdelay 30\n\tpkey 1\n\tdelay $reset\n\tpkey 0\n\n\tlogComment ====== reset sequence finish ======\n\ndef bootToEDL()\n\tlogComment ====== bootToEDL start ======\n\tusb0 1\n\tusb1 1\n\tpkey 0\n\tvolup 0\n\tvoldn 0\n\tpedl 1\n\tdelay 900\n\tusb0 0\n\tusb1 0\n\tdelay 30\n\tpkey 1\n\tdelay $edl\n\tpkey 0\n\tpedl 0\n\n\tlogComment ====== bootToEDL finish ======\n\ndef bootToUEFI()\n\tlogComment ====== bootToUEFIMenu start ======\n\n\t// Put buttons in a set state\n\tpkey 0\n\tpedl 0\n\tvolup 0\n\tdelay 900\n\n\tpkey 1\n\tdelay 900\n\tvolup 1\n\n\tdelay $uefi\n\t\n\tvolup 0\n\tdelay 900\n\tpkey 0\n\n\tlogComment ====== bootToUEFIMenu finish ======\n", "usb_descriptor": "ALPACA-LITE GLYMUR CRD BATTERY", "pins": [ { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "0", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "0", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "pshold", "initial_value": false, "input": false, "inverted": false, "pin_number": "0", "priority": 0 }, { "bus": "D", "chip_index": 0, "command": "volup", "initial_value": false, "input": false, "inverted": false, "pin_number": "0", "priority": 0 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "1", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "1", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "uim1", "initial_value": false, "input": false, "inverted": false, "pin_number": "1", "priority": 0 }, { "bus": "D", "chip_index": 0, "command": "battery", "initial_value": false, "input": false, "inverted": true, "pin_number": "1", "priority": 2 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "2", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "2", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "headset", "initial_value": false, "input": false, "inverted": false, "pin_number": "2", "priority": 0 }, { "bus": "D", "chip_index": 0, "command": "voldn", "initial_value": false, "input": false, "inverted": false, "pin_number": "2", "priority": 0 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "3", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "3", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "uim2", "initial_value": false, "input": false, "inverted": false, "pin_number": "3", "priority": 0 }, { "bus": "D", "chip_index": 0, "command": "pkey", "initial_value": false, "input": false, "inverted": false, "pin_number": "3", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "4", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "4", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "sdcard", "initial_value": false, "input": false, "inverted": false, "pin_number": "4", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "eud", "initial_value": false, "input": false, "inverted": false, "pin_number": "4", "priority": 0 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "5", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "5", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "sedl", "initial_value": false, "input": false, "inverted": false, "pin_number": "5", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "pedl", "initial_value": false, "input": false, "inverted": false, "pin_number": "5", "priority": 0 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "6", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "6", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "usb1", "initial_value": false, "input": false, "inverted": true, "pin_number": "6", "priority": 0 }, { "bus": "D", "chip_index": 0, "command": "TC_READY_N", "initial_value": true, "input": false, "inverted": false, "pin_number": "6", "priority": 1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "7", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "7", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "sresn", "initial_value": false, "input": false, "inverted": false, "pin_number": "7", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "usb0", "initial_value": false, "input": false, "inverted": true, "pin_number": "7", "priority": 0 } ], "variables": [ { "default_value": "17000", "name": "edl" }, { "default_value": "20000", "name": "reset" }, { "default_value": "20000", "name": "uefi" } ] } pytactl-3.2/pytactl/tac_configs/TAC_FTDI_63.pinout.json000066400000000000000000000254131526550266300227510ustar00rootroot00000000000000{ "$schema": "https://qualcomm.github.io/tac/schemas/pinout-1.0.json", "format": "tac-pinout", "schema_version": "1.0", "source": { "repository": "https://github.com/qualcomm/qcom-test-automation-controller.git", "commit": "757cc972c88e4a1098881b2bc73f3d53eac286be", "path": "configurations", "file": "TAC_FTDI_63.tcnf" }, "bus": [ { "bus": "A", "bus_function": 1, "chip_index": 0 }, { "bus": "B", "bus_function": 1, "chip_index": 0 }, { "bus": "C", "bus_function": 2, "chip_index": 0 }, { "bus": "D", "bus_function": 2, "chip_index": 0 } ], "chip_count": 1, "description": "AR TAC config for BONSAI", "name": "Bonsai XRV7205", "platform_id": 63, "platform_type": "FTDI", "reset_enabled": false, "script": "def powerOffTheDevice() \n\tlogComment ====== powerOffTheDevice sequence start ======\n\n\tbattery 1\n\tusb0 1\n\tusb1 1\n\n\tlogComment ====== powerOffTheDevice sequence finish ======\n\ndef powerOnTheDevice()\n\tlogComment ====== powerOnTheDevice sequence start ======\n\n\tdelay 500\n\tbattery 0\n\tdelay 900\n\tusb0 0\n\tusb1 0\n\tdelay 30\n\n\tlogComment ====== powerOnTheDevice sequence finish ======\n\ndef powerOff()\n\tlogComment ====== powerOff start ======\n\n\tpowerOffTheDevice\n\n\tpkey 0\n\tvolup 0\n\tvoldn 0\n\n\tpedl 0\n\n\tlogComment ====== powerOff finish ======\n\ndef powerOn()\n\tlogComment ====== powerOn start ======\n\n\tpowerOff\n\n\tpowerOnTheDevice\n\n\tpkey 1\n\tdelay 800\n\tpkey 0\n\n\tlogComment ====== powerOn finish ======\n\ndef bootToEDL()\n\tlogComment ====== bootToEDL start ======\n\n\tpowerOffTheDevice\n\n\tpkey 0\n\tvolup 0\n\tvoldn 0\n\n\tpedl 1\n\n\tpowerOnTheDevice\n\n\tpkey 1\n\tdelay $edl\n\tpkey 0\n\n\tpedl 0\n\n\tlogComment ====== bootToEDL finish ======\n\ndef bootToSecondaryEDL()\n\tlogComment ====== bootToSecondaryEDL start ======\n\n\tpowerOffTheDevice\n\n\tpkey 0\n\tvolup 0\n\tvoldn 0\n\n\tsedl 1\n\n\tpowerOnTheDevice\n\n\tpkey 1\n\tdelay 800\n\tpkey 0\n\n\tdelay 1300\n\n\tsedl 0\n\n\tlogComment ====== bootToSecondaryEDL finish ======\n\ndef bootToUEFI()\n\tlogComment ====== bootToUEFIMenu start ======\n\n\tpowerOffTheDevice\n\n\t// Put buttons in a set state\n\tpkey 0\n\tvolup 1\n\tvoldn 0\n\n\tpedl 0\n\n\tpowerOnTheDevice\n\n\tpkey 1\n\tdelay $uefi\n\tpkey 0\n\tvolup 0\n\tdelay 12\n\tpkey 1\n\tvolup 1\n\n\tpkey 0\n\tvolup 0\n\n\tlogComment ====== bootToUEFIMenu finish ======\n\ndef bootToFastboot()\n\tlogComment ====== bootToFastboot start ======\n\n\tpowerOffTheDevice\n\n\tpkey 0\n\tvolup 0\n\tvoldn 1\n\n\tpedl 0\n\n\tpowerOnTheDevice\n\n\tpkey 1\n\tdelay 800\n\tpkey 0\n\n\tdelay $fastboot\n\tvoldn 0\n\tdelay 30\n\tvoldn 1\n\n\tvoldn 0\n\n\tlogComment ====== bootToFastboot finished ======\n", "usb_descriptor": "ALPACA-LITE FOR AR V1", "pins": [ { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "0", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "0", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "pshold", "initial_value": false, "input": false, "inverted": false, "pin_number": "0", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "volup", "initial_value": false, "input": false, "inverted": false, "pin_number": "0", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "1", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "1", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "back", "initial_value": false, "input": false, "inverted": false, "pin_number": "1", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "battery", "initial_value": false, "input": false, "inverted": true, "pin_number": "1", "priority": 2 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "2", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "2", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "voldn", "initial_value": false, "input": false, "inverted": false, "pin_number": "2", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "3", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "3", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "rcmmarker0", "initial_value": false, "input": false, "inverted": false, "pin_number": "3", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "pkey", "initial_value": false, "input": false, "inverted": false, "pin_number": "3", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "4", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "4", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "eud", "initial_value": false, "input": false, "inverted": false, "pin_number": "4", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "5", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "5", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "sedl", "initial_value": false, "input": false, "inverted": false, "pin_number": "5", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "pedl", "initial_value": false, "input": false, "inverted": false, "pin_number": "5", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "6", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "6", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "usb1", "initial_value": false, "input": false, "inverted": true, "pin_number": "6", "priority": 2 }, { "bus": "D", "chip_index": 0, "command": "", "initial_value": true, "input": false, "inverted": false, "pin_number": "6", "priority": 1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "7", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "7", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "sresn", "initial_value": false, "input": false, "inverted": false, "pin_number": "7", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "usb0", "initial_value": false, "input": false, "inverted": true, "pin_number": "7", "priority": 2 } ], "variables": [ { "default_value": "1300", "name": "edl" }, { "default_value": "8000", "name": "fastboot" }, { "default_value": "8000", "name": "uefi" } ] } pytactl-3.2/pytactl/tac_configs/TAC_FTDI_64.pinout.json000066400000000000000000000264141526550266300227540ustar00rootroot00000000000000{ "$schema": "https://qualcomm.github.io/tac/schemas/pinout-1.0.json", "format": "tac-pinout", "schema_version": "1.0", "source": { "repository": "https://github.com/qualcomm/qcom-test-automation-controller.git", "commit": "757cc972c88e4a1098881b2bc73f3d53eac286be", "path": "configurations", "file": "TAC_FTDI_64.tcnf" }, "bus": [ { "bus": "A", "bus_function": 1, "chip_index": 0 }, { "bus": "B", "bus_function": 1, "chip_index": 0 }, { "bus": "C", "bus_function": 2, "chip_index": 0 }, { "bus": "D", "bus_function": 2, "chip_index": 0 } ], "chip_count": 1, "description": "FTDI-LITE SDX95 QMP", "name": "SDX95 QMP", "platform_id": 64, "platform_type": "FTDI", "reset_enabled": false, "script": "def powerOffTheDevice() \n\tlogComment ====== powerOffTheDevice sequence start ======\n\n\tbattery 1\n\tusb0 1\n//\tusb1 1\n\n\tlogComment ====== powerOffTheDevice sequence finish ======\n\ndef powerOnTheDevice()\n\tlogComment ====== powerOnTheDevice sequence start ======\n\n\tdelay 500\n\tbattery 0\n\tdelay 900\n\tusb0 0\n//\tusb1 0\n\tdelay 30\n\n\tlogComment ====== powerOnTheDevice sequence finish ======\n\ndef powerOff()\n\tlogComment ====== powerOff start ======\n\n\tpowerOffTheDevice\n\n\tpkey 0\n\tvolup 0\n\tvoldn 0\n\n\tpedl 0\n\n\tlogComment ====== powerOff finish ======\n\ndef powerOn()\n\tlogComment ====== powerOn start ======\n\n\tpowerOff\n\n\tpowerOnTheDevice\n\n\tpkey 1\n\tdelay 800\n\tpkey 0\n\n\tlogComment ====== powerOn finish ======\n\ndef bootToEDL()\n\tlogComment ====== bootToEDL start ======\n\n\tpowerOffTheDevice\n\n\tpkey 0\n\tvolup 0\n\tvoldn 0\n\n\tpedl 1\n\n\tpowerOnTheDevice\n\n\tpkey 1\n\tdelay $edl\n\tpkey 0\n\n\tpedl 0\n\n\tlogComment ====== bootToEDL finish ======\n\ndef bootToSecondaryEDL()\n\tlogComment ====== bootToSecondaryEDL start ======\n\n\tpowerOffTheDevice\n\n\tpkey 0\n\tvolup 0\n\tvoldn 0\n\n\tsedl 1\n\n\tpowerOnTheDevice\n\n\tpkey 1\n\tdelay 800\n\tpkey 0\n\n\tdelay 1300\n\n\tsedl 0\n\n\tlogComment ====== bootToSecondaryEDL finish ======\n\ndef bootToUEFIMenu()\n\tlogComment ====== bootToUEFIMenu start ======\n\n\tpowerOffTheDevice\n\n\t// Put buttons in a set state\n\tpkey 0\n\tvolup 1\n\tvoldn 0\n\n\tpedl 0\n\n\tpowerOnTheDevice\n\n\tpkey 1\n\tdelay $uefi\n\tpkey 0\n\tvolup 0\n\tdelay 12\n\tpkey 1\n\tvolup 1\n\n\tpkey 0\n\tvolup 0\n\n\tlogComment ====== bootToUEFIMenu finish ======\n\ndef bootToFastBoot()\n\tlogComment ====== bootToFastBoot start ======\n\n\tpowerOffTheDevice\n\n\tpkey 0\n\tvolup 0\n\tvoldn 1\n\n\tpedl 0\n\n\tpowerOnTheDevice\n\n\tpkey 1\n\tdelay 800\n\tpkey 0\n\n\tdelay $fastboot\n\tvoldn 0\n\tdelay 30\n\tvoldn 1\n\n\tvoldn 0\n\n\tlogComment ====== bootToFastBoot finished ======\n", "usb_descriptor": "ALPACA-LITE SDX95 QMP", "pins": [ { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "0", "priority": 99 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "0", "priority": 99 }, { "bus": "C", "chip_index": 0, "command": "pshold", "initial_value": false, "input": false, "inverted": false, "pin_number": "0", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "volup", "initial_value": false, "input": false, "inverted": false, "pin_number": "0", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "1", "priority": 99 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "1", "priority": 99 }, { "bus": "C", "chip_index": 0, "command": "uim1", "initial_value": false, "input": false, "inverted": false, "pin_number": "1", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "battery", "initial_value": false, "input": false, "inverted": true, "pin_number": "1", "priority": 2 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "2", "priority": 99 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "2", "priority": 99 }, { "bus": "C", "chip_index": 0, "command": "headset", "initial_value": false, "input": false, "inverted": false, "pin_number": "2", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "voldn", "initial_value": false, "input": false, "inverted": false, "pin_number": "2", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "3", "priority": 99 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "3", "priority": 99 }, { "bus": "C", "chip_index": 0, "command": "uim2", "initial_value": false, "input": false, "inverted": false, "pin_number": "3", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "pkey", "initial_value": false, "input": false, "inverted": false, "pin_number": "3", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "4", "priority": 99 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "4", "priority": 99 }, { "bus": "C", "chip_index": 0, "command": "sdcard", "initial_value": false, "input": false, "inverted": false, "pin_number": "4", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "eud", "initial_value": false, "input": false, "inverted": false, "pin_number": "4", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "5", "priority": 99 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "5", "priority": 99 }, { "bus": "C", "chip_index": 0, "command": "sedl", "initial_value": false, "input": false, "inverted": false, "pin_number": "5", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "pedl", "initial_value": false, "input": false, "inverted": false, "pin_number": "5", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "6", "priority": 99 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "6", "priority": 99 }, { "bus": "C", "chip_index": 0, "command": "usb1", "initial_value": false, "input": false, "inverted": true, "pin_number": "6", "priority": 2 }, { "bus": "D", "chip_index": 0, "command": "", "initial_value": true, "input": false, "inverted": false, "pin_number": "6", "priority": 1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "7", "priority": 99 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "7", "priority": 99 }, { "bus": "C", "chip_index": 0, "command": "sresn", "initial_value": false, "input": false, "inverted": false, "pin_number": "7", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "usb0", "initial_value": false, "input": false, "inverted": true, "pin_number": "7", "priority": 2 } ], "variables": [ { "default_value": "1300", "name": "edl" }, { "default_value": "8000", "name": "fastboot" }, { "default_value": "8000", "name": "uefi" } ] } pytactl-3.2/pytactl/tac_configs/TAC_FTDI_65.pinout.json000066400000000000000000000177601526550266300227610ustar00rootroot00000000000000{ "$schema": "https://qualcomm.github.io/tac/schemas/pinout-1.0.json", "format": "tac-pinout", "schema_version": "1.0", "source": { "repository": "https://github.com/qualcomm/qcom-test-automation-controller.git", "commit": "757cc972c88e4a1098881b2bc73f3d53eac286be", "path": "configurations", "file": "TAC_FTDI_65.tcnf" }, "bus": [ { "bus": "A", "bus_function": 1, "chip_index": 0 }, { "bus": "B", "bus_function": 1, "chip_index": 0 }, { "bus": "C", "bus_function": 2, "chip_index": 0 }, { "bus": "D", "bus_function": 2, "chip_index": 0 } ], "chip_count": 1, "description": "MTP8975 (Hawi) FTDI IO", "supportedFirmwareVer": [ 16 ], "name": "Hawi MTP8975", "platform_id": 65, "platform_type": "FTDI", "reset_enabled": false, "script": "def powerOffTheDevice() \n\tlogComment ====== powerOffTheDevice sequence start ======\n\n\tbattery 1\n\tusb0 1\n\tusb1 1\n\n\tlogComment ====== powerOffTheDevice sequence finish ======\n\ndef powerOnTheDevice()\n\tlogComment ====== powerOnTheDevice sequence start ======\n\n\tdelay 500\n\tbattery 0\n\tdelay 900\n\tusb0 0\n\tusb1 0\n\tdelay 30\n\n\tlogComment ====== powerOnTheDevice sequence finish ======\n\ndef powerOff()\n\tlogComment ====== powerOff start ======\n\n\tpowerOffTheDevice\n\n\tpkey 0\n\tvolup 0\n\tvoldn 0\n\n\tpedl 0\n\n\tlogComment ====== powerOff finish ======\n\ndef powerOn()\n\tlogComment ====== powerOn start ======\n\n\tpowerOff\n\n\tpowerOnTheDevice\n\n\tpkey 1\n\tdelay 800\n\tpkey 0\n\n\tlogComment ====== powerOn finish ======\n\ndef bootToEDL()\n\tlogComment ====== bootToEDL start ======\n\n\tpowerOffTheDevice\n\n\tpkey 0\n\tvolup 0\n\tvoldn 0\n\n\tpedl 1\n\n\tpowerOnTheDevice\n\n\tpkey 1\n\tdelay 1300\n\tpkey 0\n\n\tpedl 0\n\n\tlogComment ====== bootToEDL finish ======\n\ndef bootToSecondaryEDL()\n\tlogComment ====== bootToSecondaryEDL start ======\n\n\tpowerOffTheDevice\n\n\tpkey 0\n\tvolup 0\n\tvoldn 0\n\n\tsedl 1\n\n\tpowerOnTheDevice\n\n\tpkey 1\n\tdelay 800\n\tpkey 0\n\n\tdelay 1300\n\n\tsedl 0\n\n\tlogComment ====== bootToSecondaryEDL finish ======\n\ndef bootToBatteryEDL()\n\tlogComment ====== bootToBatteryEDL start ======\n\t\n\tpedl 1 //set EDL high\n\tvoldn 1 //reset MTP after 115 seconds\n\tdelay 14000\n\n\tpkey 1\n\tdelay 1300\n\tpkey 0\n\t\n\t//reset buttons\n\tdelay 6000\n\tvoldn 0 \n\tpedl 0\n\n\tlogComment ====== bootToBatteryEDL finish ======\n\ndef bootToUEFI()\n\tlogComment ====== bootToUEFIMenu start ======\n\n\tpowerOffTheDevice\n\n\t// Put buttons in a set state\n\tpkey 0\n\tvolup 1\n\tvoldn 0\n\n\tpedl 0\n\n\tpowerOnTheDevice\n\tdelay 1500 //requires at least 700ms for pd controller negotiation\n\tpkey 1\n\tdelay 8000\n\tpkey 0\n\tvolup 0\n\tdelay 12\n\tpkey 1\n\tvolup 1\n\n\tpkey 0\n\tvolup 0\n\n\tlogComment ====== bootToUEFIMenu finish ======\n\ndef bootToFastboot()\n\tlogComment ====== bootToFastboot start ======\n\n\tpowerOffTheDevice\n\n\tpkey 0\n\tvolup 0\n\tvoldn 1\n\n\tpedl 0\n\n\tpowerOnTheDevice\n\n\tpkey 1\n\tdelay 2000\n\tpkey 0\n\n\tdelay 6000\n\tvoldn 0\n\tdelay 30\n\tvoldn 1\n\n\tvoldn 0\n\n\tlogComment ====== bootToFastboot finished ======\n\ndef batteryReset()\n\tlogComment ====== batteryReset ======\n\t\n\tpedl 0 //reset EDL\n\tvoldn 1 //reset MTP after 14 seconds\n\tdelay 14000\n\n\tpkey 1\n\tdelay 1300\n\tpkey 0\n\n\tdelay 6000\n\tvoldn 0 //release voldn to stop MTP reset\n\n\tlogComment ====== batteryReset ======", "usb_descriptor": "ALPACA-LITE MTP8975", "pins": [ { "bus": "C", "chip_index": 0, "command": "pshold", "initial_value": false, "input": false, "inverted": false, "pin_number": "0", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "volup", "initial_value": false, "input": false, "inverted": false, "pin_number": "0", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "uim1", "initial_value": false, "input": false, "inverted": false, "pin_number": "1", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "battery", "initial_value": false, "input": false, "inverted": true, "pin_number": "1", "priority": 2 }, { "bus": "C", "chip_index": 0, "command": "headset", "initial_value": false, "input": false, "inverted": false, "pin_number": "2", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "voldn", "initial_value": false, "input": false, "inverted": false, "pin_number": "2", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "uim2", "initial_value": false, "input": false, "inverted": false, "pin_number": "3", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "pkey", "initial_value": false, "input": false, "inverted": false, "pin_number": "3", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "sdcard", "initial_value": false, "input": false, "inverted": false, "pin_number": "4", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "eud", "initial_value": false, "input": false, "inverted": false, "pin_number": "4", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "msmreset", "initial_value": false, "input": false, "inverted": false, "pin_number": "5", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "pedl", "initial_value": false, "input": false, "inverted": false, "pin_number": "5", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "rcmsel", "initial_value": false, "input": false, "inverted": false, "pin_number": "6", "priority": 2 }, { "bus": "D", "chip_index": 0, "command": "", "initial_value": true, "input": false, "inverted": false, "pin_number": "6", "priority": 1 }, { "bus": "C", "chip_index": 0, "command": "sresn", "initial_value": false, "input": false, "inverted": false, "pin_number": "7", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "usb0", "initial_value": false, "input": false, "inverted": true, "pin_number": "7", "priority": 2 } ], "variables": [ { "default_value": "1300", "name": "edl" }, { "default_value": "8000", "name": "fastboot" }, { "default_value": "8000", "name": "uefi" } ] } pytactl-3.2/pytactl/tac_configs/TAC_FTDI_67.pinout.json000066400000000000000000000275241526550266300227620ustar00rootroot00000000000000{ "$schema": "https://qualcomm.github.io/tac/schemas/pinout-1.0.json", "format": "tac-pinout", "schema_version": "1.0", "source": { "repository": "https://github.com/qualcomm/qcom-test-automation-controller.git", "commit": "757cc972c88e4a1098881b2bc73f3d53eac286be", "path": "configurations", "file": "TAC_FTDI_67.tcnf" }, "bus": [ { "bus": "A", "bus_function": 2, "chip_index": 0 }, { "bus": "B", "bus_function": 2, "chip_index": 0 }, { "bus": "C", "bus_function": 2, "chip_index": 0 }, { "bus": "D", "bus_function": 2, "chip_index": 0 } ], "chip_count": 1, "description": "TDP535 Platform Config", "name": "AmboseliAQ Lite", "platform_id": 67, "platform_type": "FTDI", "reset_enabled": false, "script": "def powerOffTheDevice() \n\tlogComment ====== powerOffTheDevice sequence start ======\n\n\tbattery 1\n\tusb0 1\n\tusb1 1\n\n\tlogComment ====== powerOffTheDevice sequence finish ======\n\ndef powerOnTheDevice()\n\tlogComment ====== powerOnTheDevice sequence start ======\n\n\tdelay 500\n\tbattery 0\n\tdelay 900\n\tusb0 0\n\tusb1 0\n\tdelay 30\n\n\tlogComment ====== powerOnTheDevice sequence finish ======\n\ndef powerOff()\n\tlogComment ====== powerOff start ======\n\n\tpowerOffTheDevice\n\n\tpkey 0\n\tvolup 0\n\tvoldn 0\n\n\tpedl 0\n\n\tlogComment ====== powerOff finish ======\n\ndef powerOn()\n\tlogComment ====== powerOn start ======\n\n\tpowerOff\n\n\tpowerOnTheDevice\n\n\tpkey 1\n\tdelay 800\n\tpkey 0\n\n\tlogComment ====== powerOn finish ======\n\ndef powerCycle()\n\tlogComment ====== powerCycle sequence start ======\n\n\tpowerOff\n\tdelay $pcycle\n\tpowerOn\n\n\tlogComment ====== powerCycle sequence finish ======\n\ndef bootToEDL()\n\tlogComment ====== bootToEDL start ======\n\n\tpowerOffTheDevice\n\n\tpkey 0\n\tvolup 0\n\tvoldn 0\n\n\tpedl 1\n\n\tpowerOnTheDevice\n\n\tpkey 1\n\tdelay $edl\n\tpkey 0\n\n\tpedl 0\n\n\tlogComment ====== bootToEDL finish ======\n\ndef bootToSecondaryEDL()\n\tlogComment ====== bootToSecondaryEDL start ======\n\n\tpowerOffTheDevice\n\n\tpkey 0\n\tvolup 0\n\tvoldn 0\n\n\tsedl 1\n\n\tpowerOnTheDevice\n\n\tpkey 1\n\tdelay 800\n\tpkey 0\n\n\tdelay 1300\n\n\tsedl 0\n\n\tlogComment ====== bootToSecondaryEDL finish ======\n\ndef bootToUEFI()\n\tlogComment ====== bootToUEFIMenu start ======\n\n\tpowerOffTheDevice\n\n\t// Put buttons in a set state\n\tpkey 0\n\tvolup 1\n\tvoldn 0\n\n\tpedl 0\n\n\tpowerOnTheDevice\n\n\tpkey 1\n\tdelay $uefi\n\tpkey 0\n\tvolup 0\n\tdelay 12\n\tpkey 1\n\tvolup 1\n\n\tpkey 0\n\tvolup 0\n\n\tlogComment ====== bootToUEFIMenu finish ======\n\ndef bootToFastboot()\n\tlogComment ====== bootToFastboot start ======\n\n\tpowerOffTheDevice\n\n\tpkey 0\n\tvolup 0\n\tvoldn 1\n\n\tpedl 0\n\n\tpowerOnTheDevice\n\n\tpkey 1\n\tdelay 800\n\tpkey 0\n\n\tdelay $fastboot\n\tvoldn 0\n\tdelay 30\n\tvoldn 1\n\n\tvoldn 0\n\n\tlogComment ====== bootToFastboot finished ======\n\ndef enASM()\n\tlogComment ====== enASM start ======\n\t\n\tsmuxs1 1\n\tsmuxs2 1\n\t\n\tlogComment ====== enASM finished ======\n\ndef enS230()\n\tlogComment ====== enS230 start ======\n\t\n\tsmuxs1 0\n\tsumxs2 1\n\t\n\tlogComment ====== enS230 finished ======\n\ndef enIAM()\n\tlogComment ====== enIAM start ======\n\t\n\tsmuxs1 1\n\tsmuxs2 0\n\t\n\tlogComment ====== enIAM finished ======\n\ndef enS330()\n\tlogComment ====== enS330 start ======\n\t\n\tsmuxs1 0\n\tsmuxs2 0\n\t\n\tlogComment ====== enS330 finished ======", "usb_descriptor": "ALPACA-LITE TDP535 BOARD", "pins": [ { "bus": "A", "chip_index": 0, "command": "bc0", "initial_value": false, "input": false, "inverted": false, "pin_number": "0", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "bc8", "initial_value": false, "input": false, "inverted": false, "pin_number": "0", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "pshold", "initial_value": false, "input": false, "inverted": false, "pin_number": "0", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "volup", "initial_value": false, "input": false, "inverted": false, "pin_number": "0", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "bc1", "initial_value": false, "input": false, "inverted": false, "pin_number": "1", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "bc9", "initial_value": false, "input": false, "inverted": false, "pin_number": "1", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "mode0", "initial_value": false, "input": false, "inverted": false, "pin_number": "1", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "battery", "initial_value": false, "input": false, "inverted": true, "pin_number": "1", "priority": 2 }, { "bus": "A", "chip_index": 0, "command": "bc2", "initial_value": false, "input": false, "inverted": false, "pin_number": "2", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "TBD", "initial_value": false, "input": false, "inverted": false, "pin_number": "2", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "emmc_boot", "initial_value": false, "input": false, "inverted": false, "pin_number": "2", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "voldn", "initial_value": false, "input": false, "inverted": false, "pin_number": "2", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "bc3", "initial_value": false, "input": false, "inverted": false, "pin_number": "3", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "uim0", "initial_value": false, "input": false, "inverted": false, "pin_number": "3", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "mode1", "initial_value": false, "input": false, "inverted": false, "pin_number": "3", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "pkey", "initial_value": false, "input": false, "inverted": false, "pin_number": "3", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "uim1", "initial_value": false, "input": false, "inverted": false, "pin_number": "4", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "emmc", "initial_value": false, "input": false, "inverted": false, "pin_number": "4", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "eud", "initial_value": false, "input": false, "inverted": false, "pin_number": "4", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "bc5", "initial_value": false, "input": false, "inverted": false, "pin_number": "5", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "esim", "initial_value": false, "input": false, "inverted": false, "pin_number": "5", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "sdcard", "initial_value": false, "input": false, "inverted": false, "pin_number": "5", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "pedl", "initial_value": false, "input": false, "inverted": false, "pin_number": "5", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "bc6", "initial_value": false, "input": false, "inverted": false, "pin_number": "6", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "smuxs2", "initial_value": false, "input": false, "inverted": false, "pin_number": "6", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "isim_nvm", "initial_value": false, "input": false, "inverted": false, "pin_number": "6", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "", "initial_value": true, "input": false, "inverted": false, "pin_number": "6", "priority": 1 }, { "bus": "A", "chip_index": 0, "command": "bc7", "initial_value": false, "input": false, "inverted": false, "pin_number": "7", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "smuxs1", "initial_value": false, "input": false, "inverted": false, "pin_number": "7", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "tcready", "initial_value": false, "input": false, "inverted": false, "pin_number": "7", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "usb0", "initial_value": false, "input": false, "inverted": true, "pin_number": "7", "priority": 2 } ], "variables": [ { "default_value": "1300", "name": "edl" }, { "default_value": "8000", "name": "fastboot" }, { "default_value": "2000", "name": "pcycle" }, { "default_value": "8000", "name": "uefi" } ] } pytactl-3.2/pytactl/tac_configs/TAC_FTDI_69.pinout.json000066400000000000000000000264631526550266300227650ustar00rootroot00000000000000{ "$schema": "https://qualcomm.github.io/tac/schemas/pinout-1.0.json", "format": "tac-pinout", "schema_version": "1.0", "source": { "repository": "https://github.com/qualcomm/qcom-test-automation-controller.git", "commit": "757cc972c88e4a1098881b2bc73f3d53eac286be", "path": "configurations", "file": "TAC_FTDI_69.tcnf" }, "bus": [ { "bus": "A", "bus_function": 1, "chip_index": 0 }, { "bus": "B", "bus_function": 1, "chip_index": 0 }, { "bus": "C", "bus_function": 2, "chip_index": 0 }, { "bus": "D", "bus_function": 2, "chip_index": 0 } ], "chip_count": 1, "description": "FTDI-LITE SDX95 M.2", "name": "SDX95 M.2", "platform_id": 69, "platform_type": "FTDI", "reset_enabled": false, "script": "def powerOffTheDevice() \n\tlogComment ====== powerOffTheDevice sequence start ======\n\n\tbattery 1\n\tusb0 1\n//\tusb1 1\n\n\tlogComment ====== powerOffTheDevice sequence finish ======\n\ndef powerOnTheDevice()\n\tlogComment ====== powerOnTheDevice sequence start ======\n\n\tdelay 500\n\tbattery 0\n\tdelay 900\n\tusb0 0\n//\tusb1 0\n\tdelay 30\n\n\tlogComment ====== powerOnTheDevice sequence finish ======\n\ndef powerOff()\n\tlogComment ====== powerOff start ======\n\n\tpowerOffTheDevice\n\n\tpkey 0\n\tvolup 0\n\tvoldn 0\n\n\tpedl 0\n\n\tlogComment ====== powerOff finish ======\n\ndef powerOn()\n\tlogComment ====== powerOn start ======\n\n\tpowerOff\n\n\tpowerOnTheDevice\n\n\tpkey 1\n\tdelay 800\n\tpkey 0\n\n\tlogComment ====== powerOn finish ======\n\ndef bootToEDL()\n\tlogComment ====== bootToEDL start ======\n\n\tpowerOffTheDevice\n\n\tpkey 0\n\tvolup 0\n\tvoldn 0\n\n\tusbboot 1\n\tpedl 1\n\n\tpowerOnTheDevice\n\n\tpkey 1\n\tdelay $edl\n\tpkey 0\n\n\tpedl 0\n\tusbboot 0\n\n\tlogComment ====== bootToEDL finish ======\n\ndef bootToSecondaryEDL()\n\tlogComment ====== bootToSecondaryEDL start ======\n\n\tpowerOffTheDevice\n\n\tpkey 0\n\tvolup 0\n\tvoldn 0\n\n\tsedl 1\n\n\tpowerOnTheDevice\n\n\tpkey 1\n\tdelay 800\n\tpkey 0\n\n\tdelay 1300\n\n\tsedl 0\n\n\tlogComment ====== bootToSecondaryEDL finish ======\n\ndef bootToUEFIMenu()\n\tlogComment ====== bootToUEFIMenu start ======\n\n\tpowerOffTheDevice\n\n\t// Put buttons in a set state\n\tpkey 0\n\tvolup 1\n\tvoldn 0\n\n\tpedl 0\n\n\tpowerOnTheDevice\n\n\tpkey 1\n\tdelay $uefi\n\tpkey 0\n\tvolup 0\n\tdelay 12\n\tpkey 1\n\tvolup 1\n\n\tpkey 0\n\tvolup 0\n\n\tlogComment ====== bootToUEFIMenu finish ======\n\ndef bootToFastBoot()\n\tlogComment ====== bootToFastBoot start ======\n\n\tpowerOffTheDevice\n\n\tpkey 0\n\tvolup 0\n\tvoldn 1\n\n\tpedl 0\n\n\tpowerOnTheDevice\n\n\tpkey 1\n\tdelay 800\n\tpkey 0\n\n\tdelay $fastboot\n\tvoldn 0\n\tdelay 30\n\tvoldn 1\n\n\tvoldn 0\n\n\tlogComment ====== bootToFastBoot finished ======\n", "usb_descriptor": "ALPACA-LITE SDX95 M.2", "pins": [ { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "0", "priority": 99 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "0", "priority": 99 }, { "bus": "C", "chip_index": 0, "command": "pshold", "initial_value": false, "input": false, "inverted": false, "pin_number": "0", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "usbboot", "initial_value": false, "input": false, "inverted": false, "pin_number": "0", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "1", "priority": 99 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "1", "priority": 99 }, { "bus": "C", "chip_index": 0, "command": "uim1", "initial_value": false, "input": false, "inverted": false, "pin_number": "1", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "battery", "initial_value": false, "input": false, "inverted": true, "pin_number": "1", "priority": 2 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "2", "priority": 99 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "2", "priority": 99 }, { "bus": "C", "chip_index": 0, "command": "headset", "initial_value": false, "input": false, "inverted": false, "pin_number": "2", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "m2reset", "initial_value": false, "input": false, "inverted": false, "pin_number": "2", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "3", "priority": 99 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "3", "priority": 99 }, { "bus": "C", "chip_index": 0, "command": "uim2", "initial_value": false, "input": false, "inverted": false, "pin_number": "3", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "fcpo", "initial_value": false, "input": false, "inverted": false, "pin_number": "3", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "4", "priority": 99 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "4", "priority": 99 }, { "bus": "C", "chip_index": 0, "command": "pciehostbypass", "initial_value": false, "input": false, "inverted": false, "pin_number": "4", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "eud", "initial_value": false, "input": false, "inverted": false, "pin_number": "4", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "5", "priority": 99 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "5", "priority": 99 }, { "bus": "C", "chip_index": 0, "command": "sedl", "initial_value": false, "input": false, "inverted": false, "pin_number": "5", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "pedl", "initial_value": false, "input": false, "inverted": false, "pin_number": "5", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "6", "priority": 99 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "6", "priority": 99 }, { "bus": "C", "chip_index": 0, "command": "usb1", "initial_value": false, "input": false, "inverted": true, "pin_number": "6", "priority": 2 }, { "bus": "D", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "6", "priority": 1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "7", "priority": 99 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "7", "priority": 99 }, { "bus": "C", "chip_index": 0, "command": "sresn", "initial_value": false, "input": false, "inverted": false, "pin_number": "7", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "usb0", "initial_value": false, "input": false, "inverted": true, "pin_number": "7", "priority": 2 } ], "variables": [ { "default_value": "1300", "name": "edl" }, { "default_value": "8000", "name": "fastboot" }, { "default_value": "8000", "name": "uefi" } ] } pytactl-3.2/pytactl/tac_configs/TAC_FTDI_70.pinout.json000066400000000000000000000253721526550266300227530ustar00rootroot00000000000000{ "$schema": "https://qualcomm.github.io/tac/schemas/pinout-1.0.json", "format": "tac-pinout", "schema_version": "1.0", "source": { "repository": "https://github.com/qualcomm/qcom-test-automation-controller.git", "commit": "757cc972c88e4a1098881b2bc73f3d53eac286be", "path": "configurations", "file": "TAC_FTDI_70.tcnf" }, "bus": [ { "bus": "A", "bus_function": 1, "chip_index": 0 }, { "bus": "B", "bus_function": 1, "chip_index": 0 }, { "bus": "C", "bus_function": 2, "chip_index": 0 }, { "bus": "D", "bus_function": 2, "chip_index": 0 } ], "chip_count": 1, "description": "ALPACA-LITE HAWI CDP", "name": "Hawi CDP", "platform_id": 70, "platform_type": "FTDI", "reset_enabled": false, "script": "def powerOffTheDevice() \n\tlogComment ====== powerOffTheDevice sequence start ======\n\n\tbattery 1\n\tusb0 1\n\t//usb1 1\n\n\tlogComment ====== powerOffTheDevice sequence finish ======\n\ndef powerOnTheDevice()\n\tlogComment ====== powerOnTheDevice sequence start ======\n\n\tdelay 500\n\tbattery 0\n\tdelay 900\n\tusb0 0\n\t//usb1 0\n\tdelay 30\n\n\tlogComment ====== powerOnTheDevice sequence finish ======\n\ndef powerOff()\n\tlogComment ====== powerOff start ======\n\n\tpowerOffTheDevice\n\n\tpkey 0\n\tvolup 0\n\tvoldn 0\n\n\tpedl 0\n\n\tlogComment ====== powerOff finish ======\n\ndef powerOn()\n\tlogComment ====== powerOn start ======\n\n\tpowerOff\n\n\tpowerOnTheDevice\n\n\tpkey 1\n\tdelay 3500\n\t//EUFI requires > 3sec delay between power/pkey\n\tpkey 0\n\n\tlogComment ====== powerOn finish ======\n\ndef bootToEDL()\n\tlogComment ====== bootToEDL start ======\n\n\tpowerOffTheDevice\n\n\tpkey 0\n\tvolup 0\n\tvoldn 0\n\n\tpedl 1\n\n\tpowerOnTheDevice\n\n\tpkey 1\n\tdelay 1300\n\tpkey 0\n\n\tpedl 0\n\n\tlogComment ====== bootToEDL finish ======\n\ndef bootToUEFI()\n\tlogComment ====== bootToUEFIMenu start ======\n\n\tpowerOffTheDevice\n\n\t// Put buttons in a set state\n\tpkey 0\n\tvolup 1\n\tvoldn 0\n\n\tpedl 0\n\n\tpowerOnTheDevice\n\n\tpkey 1\n\tdelay 8000\n\tpkey 0\n\tvolup 0\n\tdelay 12\n\tpkey 1\n\n\tpkey 0\n\tvolup 0\n\n\tlogComment ====== bootToUEFIMenu finish ======\n\ndef bootToFastboot()\n\tlogComment ====== bootToFastboot start ======\n\n\tpowerOffTheDevice\n\n\tpkey 0\n\tvolup 0\n\tvoldn 1\n\n\tpedl 0\n\n\tpowerOnTheDevice\n\n\tpkey 1\n\tdelay 2000\n\tpkey 0\n\n\tdelay 6000\n\tvoldn 0\n\tdelay 30\n\tvoldn 1\n\n\tvoldn 0\n\n\tlogComment ====== bootToFastboot finished ======\n", "usb_descriptor": "ALPACA-LITE HAWI CDP", "pins": [ { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "0", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "0", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "pshold", "initial_value": false, "input": false, "inverted": false, "pin_number": "0", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "volup", "initial_value": false, "input": false, "inverted": false, "pin_number": "0", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "1", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "1", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "mode0", "initial_value": false, "input": false, "inverted": false, "pin_number": "1", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "battery", "initial_value": false, "input": false, "inverted": true, "pin_number": "1", "priority": 2 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "2", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "2", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "gg2", "initial_value": false, "input": false, "inverted": false, "pin_number": "2", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "voldn", "initial_value": false, "input": false, "inverted": false, "pin_number": "2", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "3", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "3", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "mode1", "initial_value": false, "input": false, "inverted": false, "pin_number": "3", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "pkey", "initial_value": false, "input": false, "inverted": false, "pin_number": "3", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "4", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "4", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "sdcard", "initial_value": false, "input": false, "inverted": false, "pin_number": "4", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "eud", "initial_value": false, "input": false, "inverted": false, "pin_number": "4", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "5", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "5", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "gg1", "initial_value": false, "input": false, "inverted": false, "pin_number": "5", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "pedl", "initial_value": false, "input": false, "inverted": false, "pin_number": "5", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "6", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "6", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "gg3", "initial_value": false, "input": false, "inverted": false, "pin_number": "6", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "TC_READY_N", "initial_value": true, "input": false, "inverted": false, "pin_number": "6", "priority": 1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "7", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "7", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "sresn", "initial_value": false, "input": false, "inverted": false, "pin_number": "7", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "usb0", "initial_value": false, "input": false, "inverted": true, "pin_number": "7", "priority": 2 } ], "variables": [] } pytactl-3.2/pytactl/tac_configs/TAC_FTDI_71.pinout.json000066400000000000000000000250151526550266300227460ustar00rootroot00000000000000{ "$schema": "https://qualcomm.github.io/tac/schemas/pinout-1.0.json", "format": "tac-pinout", "schema_version": "1.0", "source": { "repository": "https://github.com/qualcomm/qcom-test-automation-controller.git", "commit": "757cc972c88e4a1098881b2bc73f3d53eac286be", "path": "configurations", "file": "TAC_FTDI_71.tcnf" }, "platform_id": 71, "name": "RB4 IQ-8275-EVK", "platform_type": "FTDI", "description": "FTDI TAC for RB4 IQ-8275-EVK", "usb_descriptor": "ALPACA-LITE FOR RB4 IQ-8275-EVK", "reset_enabled": false, "chip_count": 1, "script": "def powerOn()\n\tlogComment ====== on start ======\n\t\n\tpwr_off 0\n\n\tlogComment ====== on finish ======\n\n\ndef powerOff() \n\tlogComment ====== off start ======\n\n\tpwr_off 1\n\n\tlogComment ====== off finish ======\n\n\ndef reset()\n\tlogComment ====== reset start ======\n\n\tpowerOff\n\tdelay 1500\n\tpowerOn\n\n\tlogComment ====== reset finish ======\n\n\ndef bootToEDL()\n\tlogComment ====== s1_md_sail_edl start ======\n\n\tpowerOff\n\tsw_dnld 1\n\tss_force_edl 1\n\tdelay 1500\n\tpowerOn\n\tdelay 5000\n\tsw_dnld 0\n\tss_force_edl 0\n\n\tlogComment ====== s1_md_sail_edl finish ======\n\n\ndef bootToSecondaryEDL()\n\tlogComment ====== s1_sail_edl start ======\n\n\tpowerOff\n\tss_force_edl 1\n\tdelay 1500\n\tpowerOn\n\tdelay 5000\n\tss_force_edl 0\n\n\tlogComment ====== s1_sail_edl finish ======\n\n\ndef bootToUEFI()\n\tlogComment ====== s1_uefi start ======\n\n\treset \n\tkpd_pwr 0\n\tuefi 1\n\tkpd_pwr 1\n\tdelay 8000\n\tkpd_pwr 0\n\tuefi 0\n\n\tlogComment ====== s1_uefi finish ======\n\n\ndef bootToFastboot()\n\tlogComment ====== s1_fastboot start ======\n\n\tpowerOff\n\tdelay 1500\n\tusb2 1\n\tdelay 500\n\tpowerOn\n\tdelay 8000\n\tusb2 0\n\n\tlogComment ====== s1_fastboot finish ======\n\n\n\n", "bus": [ { "bus": "A", "bus_function": 1, "chip_index": 0 }, { "bus": "B", "bus_function": 1, "chip_index": 0 }, { "bus": "C", "bus_function": 2, "chip_index": 0 }, { "bus": "D", "bus_function": 2, "chip_index": 0 } ], "pins": [ { "bus": "A", "chip_index": 0, "command": "s2_force_md_ps_hold", "initial_value": false, "input": false, "inverted": false, "pin_number": "0", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "s2_uefi", "initial_value": false, "input": false, "inverted": false, "pin_number": "0", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "ms_ps_hold", "initial_value": false, "input": false, "inverted": false, "pin_number": "0", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "uefi", "initial_value": false, "input": false, "inverted": false, "pin_number": "0", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "s2_mode0", "initial_value": false, "input": false, "inverted": false, "pin_number": "1", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "s2_force_classic", "initial_value": false, "input": false, "inverted": false, "pin_number": "1", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "mode0", "initial_value": false, "input": false, "inverted": false, "pin_number": "1", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "pwr_off", "initial_value": false, "input": false, "inverted": false, "pin_number": "1", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "s2_md_resout", "initial_value": false, "input": false, "inverted": false, "pin_number": "2", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "s2_pmic_resin", "initial_value": false, "input": false, "inverted": false, "pin_number": "2", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "md_resout", "initial_value": false, "input": false, "inverted": false, "pin_number": "2", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "pmic_resin", "initial_value": false, "input": false, "inverted": false, "pin_number": "2", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "s2_mode1", "initial_value": false, "input": false, "inverted": false, "pin_number": "3", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "s2_kpd_pwr", "initial_value": false, "input": false, "inverted": false, "pin_number": "3", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "mode1", "initial_value": false, "input": false, "inverted": false, "pin_number": "3", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "kpd_pwr", "initial_value": false, "input": false, "inverted": false, "pin_number": "3", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "s2_ss_force_edl", "initial_value": false, "input": false, "inverted": false, "pin_number": "4", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "s2_eud_en", "initial_value": false, "input": false, "inverted": false, "pin_number": "4", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "ss_force_edl", "initial_value": false, "input": false, "inverted": false, "pin_number": "4", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "eud_en", "initial_value": false, "input": false, "inverted": false, "pin_number": "4", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "s2_usb2_disc", "initial_value": false, "input": false, "inverted": false, "pin_number": "5", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "s2_sw_dnld", "initial_value": false, "input": false, "inverted": false, "pin_number": "5", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "usb2", "initial_value": false, "input": false, "inverted": false, "pin_number": "5", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "sw_dnld", "initial_value": false, "input": false, "inverted": false, "pin_number": "5", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "s2_usb1_disc", "initial_value": false, "input": false, "inverted": false, "pin_number": "6", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "6", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "usb1", "initial_value": false, "input": false, "inverted": false, "pin_number": "6", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "oe", "initial_value": true, "input": false, "inverted": false, "pin_number": "6", "priority": 1 }, { "bus": "A", "chip_index": 0, "command": "s2_force_ss_ps_hold", "initial_value": false, "input": false, "inverted": false, "pin_number": "7", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "s2_usb0_disc", "initial_value": false, "input": false, "inverted": false, "pin_number": "7", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "sail_ps_hold", "initial_value": false, "input": false, "inverted": false, "pin_number": "7", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "usb0", "initial_value": false, "input": false, "inverted": false, "pin_number": "7", "priority": -1 } ], "variables": [] } pytactl-3.2/pytactl/tac_configs/TAC_FTDI_72.pinout.json000066400000000000000000000257761526550266300227650ustar00rootroot00000000000000{ "$schema": "https://qualcomm.github.io/tac/schemas/pinout-1.0.json", "format": "tac-pinout", "schema_version": "1.0", "source": { "repository": "https://github.com/qualcomm/qcom-test-automation-controller.git", "commit": "757cc972c88e4a1098881b2bc73f3d53eac286be", "path": "configurations", "file": "TAC_FTDI_72.tcnf" }, "platform_id": 72, "name": "AmboseliAQ JTAG MUX DC", "platform_type": "FTDI", "description": "JTAG MUX DC", "usb_descriptor": "TDP535_JTAG_MUX_DC", "reset_enabled": false, "chip_count": 1, "script": "def powerOffTheDevice() \n\tlogComment ====== powerOffTheDevice sequence start ======\n\n\tbattery 1\n\tusb0 1\n\tusb1 1\n\n\tlogComment ====== powerOffTheDevice sequence finish ======\n\ndef powerOnTheDevice()\n\tlogComment ====== powerOnTheDevice sequence start ======\n\n\tdelay 500\n\tbattery 0\n\tdelay 900\n\tusb0 0\n\tusb1 0\n\tdelay 30\n\n\tlogComment ====== powerOnTheDevice sequence finish ======\n\ndef powerOff()\n\tlogComment ====== powerOff start ======\n\n\tpowerOffTheDevice\n\n\tpkey 0\n\tvolup 0\n\tvoldn 0\n\n\tpedl 0\n\n\tlogComment ====== powerOff finish ======\n\ndef powerOn()\n\tlogComment ====== powerOn start ======\n\n\tpowerOff\n\n\tpowerOnTheDevice\n\n\tpkey 1\n\tdelay 800\n\tpkey 0\n\n\tlogComment ====== powerOn finish ======\n\ndef bootToEDL()\n\tlogComment ====== bootToEDL start ======\n\n\tpowerOffTheDevice\n\n\tpkey 0\n\tvolup 0\n\tvoldn 0\n\n\tpedl 1\n\n\tpowerOnTheDevice\n\n\tpkey 1\n\tdelay $edl\n\tpkey 0\n\n\tpedl 0\n\n\tlogComment ====== bootToEDL finish ======\n\ndef bootToSecondaryEDL()\n\tlogComment ====== bootToSecondaryEDL start ======\n\n\tpowerOffTheDevice\n\n\tpkey 0\n\tvolup 0\n\tvoldn 0\n\n\tsedl 1\n\n\tpowerOnTheDevice\n\n\tpkey 1\n\tdelay 800\n\tpkey 0\n\n\tdelay 1300\n\n\tsedl 0\n\n\tlogComment ====== bootToSecondaryEDL finish ======\n\ndef bootToUEFI()\n\tlogComment ====== bootToUEFIMenu start ======\n\n\tpowerOffTheDevice\n\n\t// Put buttons in a set state\n\tpkey 0\n\tvolup 1\n\tvoldn 0\n\n\tpedl 0\n\n\tpowerOnTheDevice\n\n\tpkey 1\n\tdelay $uefi\n\tpkey 0\n\tvolup 0\n\tdelay 12\n\tpkey 1\n\tvolup 1\n\n\tpkey 0\n\tvolup 0\n\n\tlogComment ====== bootToUEFIMenu finish ======\n\ndef bootToFastboot()\n\tlogComment ====== bootToFastboot start ======\n\n\tpowerOffTheDevice\n\n\tpkey 0\n\tvolup 0\n\tvoldn 1\n\n\tpedl 0\n\n\tpowerOnTheDevice\n\n\tpkey 1\n\tdelay 800\n\tpkey 0\n\n\tdelay $fastboot\n\tvoldn 0\n\tdelay 30\n\tvoldn 1\n\n\tvoldn 0\n\n\tlogComment ====== bootToFastboot finished ======\n", "bus": [ { "bus": "A", "bus_function": 1, "chip_index": 0 }, { "bus": "B", "bus_function": 1, "chip_index": 0 }, { "bus": "C", "bus_function": 2, "chip_index": 0 }, { "bus": "D", "bus_function": 2, "chip_index": 0 } ], "pins": [ { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "0", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "0", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "pshold", "initial_value": false, "input": false, "inverted": false, "pin_number": "0", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "volup", "initial_value": false, "input": false, "inverted": false, "pin_number": "0", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "1", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "1", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "uim1", "initial_value": false, "input": false, "inverted": false, "pin_number": "1", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "battery", "initial_value": false, "input": false, "inverted": false, "pin_number": "1", "priority": 2 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "2", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "2", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "headset", "initial_value": false, "input": false, "inverted": false, "pin_number": "2", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "voldn", "initial_value": false, "input": false, "inverted": false, "pin_number": "2", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "3", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "3", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "uim2", "initial_value": false, "input": false, "inverted": false, "pin_number": "3", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "pkey", "initial_value": false, "input": false, "inverted": false, "pin_number": "3", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "4", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "4", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "sdcard", "initial_value": false, "input": false, "inverted": false, "pin_number": "4", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "eud", "initial_value": false, "input": false, "inverted": false, "pin_number": "4", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "5", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "5", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "sedl", "initial_value": false, "input": false, "inverted": false, "pin_number": "5", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "pedl", "initial_value": false, "input": false, "inverted": false, "pin_number": "5", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "6", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "6", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "usb1", "initial_value": false, "input": false, "inverted": false, "pin_number": "6", "priority": 2 }, { "bus": "D", "chip_index": 0, "command": "TC_READY_N", "initial_value": false, "input": false, "inverted": false, "pin_number": "6", "priority": 1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "7", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "7", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "ol_en", "initial_value": false, "input": false, "inverted": false, "pin_number": "7", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "usb0", "initial_value": false, "input": false, "inverted": false, "pin_number": "7", "priority": 2 } ], "variables": [] } pytactl-3.2/pytactl/tac_configs/TAC_FTDI_73.pinout.json000066400000000000000000000177041526550266300227560ustar00rootroot00000000000000{ "$schema": "https://qualcomm.github.io/tac/schemas/pinout-1.0.json", "format": "tac-pinout", "schema_version": "1.0", "source": { "repository": "https://github.com/qualcomm/qcom-test-automation-controller.git", "commit": "757cc972c88e4a1098881b2bc73f3d53eac286be", "path": "configurations", "file": "TAC_FTDI_73.tcnf" }, "platform_id": 73, "name": "Maili MTP8950", "platform_type": "FTDI", "description": "MTP8950 (Maili) FTDI IO", "usb_descriptor": "ALPACA-LITE MTP8950", "reset_enabled": false, "chip_count": 1, "script": "def powerOffTheDevice() \n\tlogComment ====== powerOffTheDevice sequence start ======\n\n\tbattery 1\n\tusb0 1\n\tusb1 1\n\n\tlogComment ====== powerOffTheDevice sequence finish ======\n\ndef powerOnTheDevice()\n\tlogComment ====== powerOnTheDevice sequence start ======\n\n\tdelay 500\n\tbattery 0\n\tdelay 900\n\tusb0 0\n\tusb1 0\n\tdelay 30\n\n\tlogComment ====== powerOnTheDevice sequence finish ======\n\ndef powerOff()\n\tlogComment ====== powerOff start ======\n\n\tpowerOffTheDevice\n\n\tpkey 0\n\tvolup 0\n\tvoldn 0\n\n\tpedl 0\n\n\tlogComment ====== powerOff finish ======\n\ndef powerOn()\n\tlogComment ====== powerOn start ======\n\n\tpowerOff\n\n\tpowerOnTheDevice\n\n\tpkey 1\n\tdelay 800\n\tpkey 0\n\n\tlogComment ====== powerOn finish ======\n\ndef bootToEDL()\n\tlogComment ====== bootToEDL start ======\n\n\tpowerOffTheDevice\n\n\tpkey 0\n\tvolup 0\n\tvoldn 0\n\n\tpedl 1\n\n\tpowerOnTheDevice\n\n\tpkey 1\n\tdelay 1300\n\tpkey 0\n\n\tpedl 0\n\n\tlogComment ====== bootToEDL finish ======\n\ndef bootToSecondaryEDL()\n\tlogComment ====== bootToSecondaryEDL start ======\n\n\tpowerOffTheDevice\n\n\tpkey 0\n\tvolup 0\n\tvoldn 0\n\n\tsedl 1\n\n\tpowerOnTheDevice\n\n\tpkey 1\n\tdelay 800\n\tpkey 0\n\n\tdelay 1300\n\n\tsedl 0\n\n\tlogComment ====== bootToSecondaryEDL finish ======\n\ndef bootToBatteryEDL()\n\tlogComment ====== bootToBatteryEDL start ======\n\t\n\tpedl 1 //set EDL high\n\tvoldn 1 //reset MTP after 115 seconds\n\tdelay 14000\n\n\tpkey 1\n\tdelay 1300\n\tpkey 0\n\t\n\t//reset buttons\n\tdelay 6000\n\tvoldn 0 \n\tpedl 0\n\n\tlogComment ====== bootToBatteryEDL finish ======\n\ndef bootToUEFI()\n\tlogComment ====== bootToUEFIMenu start ======\n\n\tpowerOffTheDevice\n\n\t// Put buttons in a set state\n\tpkey 0\n\tvolup 1\n\tvoldn 0\n\n\tpedl 0\n\n\tpowerOnTheDevice\n\tdelay 1500 //requires at least 700ms for pd controller negotiation\n\tpkey 1\n\tdelay 8000\n\tpkey 0\n\tvolup 0\n\tdelay 12\n\tpkey 1\n\tvolup 1\n\n\tpkey 0\n\tvolup 0\n\n\tlogComment ====== bootToUEFIMenu finish ======\n\ndef bootToFastboot()\n\tlogComment ====== bootToFastboot start ======\n\n\tpowerOffTheDevice\n\n\tpkey 0\n\tvolup 0\n\tvoldn 1\n\n\tpedl 0\n\n\tpowerOnTheDevice\n\n\tpkey 1\n\tdelay 2000\n\tpkey 0\n\n\tdelay 6000\n\tvoldn 0\n\tdelay 30\n\tvoldn 1\n\n\tvoldn 0\n\n\tlogComment ====== bootToFastboot finished ======\n\ndef batteryReset()\n\tlogComment ====== batteryReset ======\n\t\n\tpedl 0 //reset EDL\n\tvoldn 1 //reset MTP after 14 seconds\n\tdelay 14000\n\n\tpkey 1\n\tdelay 1300\n\tpkey 0\n\n\tdelay 6000\n\tvoldn 0 //release voldn to stop MTP reset\n\n\tlogComment ====== batteryReset ======", "bus": [ { "bus": "A", "bus_function": 1, "chip_index": 0 }, { "bus": "B", "bus_function": 1, "chip_index": 0 }, { "bus": "C", "bus_function": 2, "chip_index": 0 }, { "bus": "D", "bus_function": 2, "chip_index": 0 } ], "pins": [ { "bus": "C", "chip_index": 0, "command": "pshold", "initial_value": false, "input": false, "inverted": false, "pin_number": "0", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "volup", "initial_value": false, "input": false, "inverted": false, "pin_number": "0", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "uim1", "initial_value": false, "input": false, "inverted": false, "pin_number": "1", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "battery", "initial_value": false, "input": false, "inverted": true, "pin_number": "1", "priority": 2 }, { "bus": "C", "chip_index": 0, "command": "headset", "initial_value": false, "input": false, "inverted": false, "pin_number": "2", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "voldn", "initial_value": false, "input": false, "inverted": false, "pin_number": "2", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "uim2", "initial_value": false, "input": false, "inverted": false, "pin_number": "3", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "pkey", "initial_value": false, "input": false, "inverted": false, "pin_number": "3", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "sdcard", "initial_value": false, "input": false, "inverted": false, "pin_number": "4", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "eud", "initial_value": false, "input": false, "inverted": false, "pin_number": "4", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "msmreset", "initial_value": false, "input": false, "inverted": false, "pin_number": "5", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "pedl", "initial_value": false, "input": false, "inverted": false, "pin_number": "5", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "rcmsel", "initial_value": false, "input": false, "inverted": false, "pin_number": "6", "priority": 2 }, { "bus": "D", "chip_index": 0, "command": "", "initial_value": true, "input": false, "inverted": false, "pin_number": "6", "priority": 1 }, { "bus": "C", "chip_index": 0, "command": "uartsel", "initial_value": false, "input": false, "inverted": false, "pin_number": "7", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "usb0", "initial_value": false, "input": false, "inverted": true, "pin_number": "7", "priority": 2 } ], "variables": [ { "default_value": "1300", "name": "edl" }, { "default_value": "8000", "name": "fastboot" }, { "default_value": "8000", "name": "uefi" } ] } pytactl-3.2/pytactl/tac_configs/TAC_FTDI_77.pinout.json000066400000000000000000000270741526550266300227630ustar00rootroot00000000000000{ "$schema": "https://qualcomm.github.io/tac/schemas/pinout-1.0.json", "format": "tac-pinout", "schema_version": "1.0", "source": { "repository": "https://github.com/qualcomm/qcom-test-automation-controller.git", "commit": "757cc972c88e4a1098881b2bc73f3d53eac286be", "path": "configurations", "file": "TAC_FTDI_77.tcnf" }, "bus": [ { "bus": "A", "bus_function": 1, "chip_index": 0 }, { "bus": "B", "bus_function": 1, "chip_index": 0 }, { "bus": "C", "bus_function": 2, "chip_index": 0 }, { "bus": "D", "bus_function": 2, "chip_index": 0 } ], "chip_count": 1, "description": "ALPACA-LITE KARNALI QCB DT", "name": "KARNALI QCB DT", "platform_id": 77, "platform_type": "FTDI", "reset_enabled": false, "script": "def powerOffTheDevice() \n\tlogComment ====== powerOffTheDevice sequence start ======\n\n\tFPPower 0\n\tusb0 1\n\tusb1 1\n\tusb3456 1\n\n\tlogComment ====== powerOffTheDevice sequence finish ======\n\ndef powerOnTheDevice()\n\tlogComment ====== powerOnTheDevice sequence start ======\n\n\tdelay 500\n\tFPPower 0\n\tdelay 900\n\tusb0 0\n\tusb1 0\n\tusb3456 0\n\tFPPower 0\n\tdelay 30\n\n\tlogComment ====== powerOnTheDevice sequence finish ======\n\ndef powerOff()\n\tlogComment ====== powerOff start ======\n\n\tpowerOffTheDevice\n\n\tFPPower 0\n\tvolup 0\n\tvoldn 0\n\n\tpedl 0\n\n\tlogComment ====== powerOff finish ======\n\ndef powerOn()\n\tlogComment ====== powerOn start ======\n\n\tpowerOff\n\n\tpowerOnTheDevice\n\n\tFPPower 1\n\tdelay 800\n\tFPPower 0\n\n\tlogComment ====== powerOn finish ======\n\ndef bootToEDL()\n\tlogComment ====== bootToEDL start ======\n\n\tpkey 0\n\tvolup 0\n\tvoldn 0\n\tFPPower 0\n\tpkey 1\n\tpedl 1\n\tdelay $reset\n\tpkey 0\n\tpedl 0\n\n\tlogComment ====== bootToEDL finish ======\n\ndef bootToSecondaryEDL()\n\tlogComment ====== bootToSecondaryEDL start ======\n\n\tpowerOffTheDevice\n\n\tpkey 0\n\tvolup 0\n\tvoldn 0\n\n\tsedl 1\n\n\tpowerOnTheDevice\n\n\tpkey 1\n\tdelay 800\n\tpkey 0\n\n\tdelay 1300\n\n\tsedl 0\n\n\tlogComment ====== bootToSecondaryEDL finish ======\n\ndef bootToUEFI()\n\tlogComment ====== bootToUEFIMenu start ======\n\n\tpowerOffTheDevice\n\n\t// Put buttons in a set state\n\tpkey 0\n\tvolup 1\n\tvoldn 0\n\n\tpedl 0\n\n\tpowerOnTheDevice\n\n\tpkey 1\n\tdelay $uefi\n\tpkey 0\n\tvolup 0\n\tdelay 12\n\tpkey 1\n\tvolup 1\n\n\tpkey 0\n\tvolup 0\n\n\tlogComment ====== bootToUEFIMenu finish ======\n\ndef bootToFastboot()\n\tlogComment ====== bootToFastboot start ======\n\n\tpowerOffTheDevice\n\n\tpkey 0\n\tvolup 0\n\tvoldn 1\n\n\tpedl 0\n\n\tpowerOnTheDevice\n\n\tpkey 1\n\tdelay 800\n\tpkey 0\n\n\tdelay $fastboot\n\tvoldn 0\n\tdelay 30\n\tvoldn 1\n\n\tvoldn 0\n\n\tlogComment ====== bootToFastboot finished ======\n\ndef reset()\n\tlogComment ====== reset start ======\n\n\tpkey 0\n\tvolup 0\n\tvoldn 0\n\tpkey 1\n\tdelay $reset\n\tpkey 0\n\n\tlogComment ====== reset finish ======\n", "usb_descriptor": "ALPACA-LITE KARNALI QCB DT", "pins": [ { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "0", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "0", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "pshold", "initial_value": false, "input": false, "inverted": false, "pin_number": "0", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "volup", "initial_value": false, "input": false, "inverted": false, "pin_number": "0", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "1", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "1", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "pmkpon", "initial_value": false, "input": false, "inverted": false, "pin_number": "1", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "atxpsu", "initial_value": false, "input": false, "inverted": false, "pin_number": "1", "priority": 2 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "2", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "2", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "usb3456", "initial_value": false, "input": false, "inverted": true, "pin_number": "2", "priority": 2 }, { "bus": "D", "chip_index": 0, "command": "voldn", "initial_value": false, "input": false, "inverted": false, "pin_number": "2", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "3", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "3", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "FPPower", "initial_value": false, "input": false, "inverted": false, "pin_number": "3", "priority": 2 }, { "bus": "D", "chip_index": 0, "command": "pkey", "initial_value": false, "input": false, "inverted": false, "pin_number": "3", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "4", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "4", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "FPReset", "initial_value": false, "input": false, "inverted": false, "pin_number": "4", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "eud", "initial_value": false, "input": false, "inverted": false, "pin_number": "4", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "5", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "5", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "karnali10gdisable", "initial_value": false, "input": false, "inverted": false, "pin_number": "5", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "pedl", "initial_value": false, "input": false, "inverted": false, "pin_number": "5", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "6", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "6", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "usb1", "initial_value": false, "input": false, "inverted": true, "pin_number": "6", "priority": 2 }, { "bus": "D", "chip_index": 0, "command": "", "initial_value": true, "input": false, "inverted": false, "pin_number": "6", "priority": 1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "7", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "7", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "karnali20gdisable", "initial_value": false, "input": false, "inverted": false, "pin_number": "7", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "usb0", "initial_value": false, "input": false, "inverted": true, "pin_number": "7", "priority": 2 } ], "variables": [ { "default_value": "1300", "name": "edl" }, { "default_value": "8000", "name": "fastboot" }, { "default_value": "20000", "name": "reset" }, { "default_value": "8000", "name": "uefi" } ] } pytactl-3.2/pytactl/tac_configs/TAC_FTDI_78.pinout.json000066400000000000000000000254011526550266300227540ustar00rootroot00000000000000{ "$schema": "https://qualcomm.github.io/tac/schemas/pinout-1.0.json", "format": "tac-pinout", "schema_version": "1.0", "source": { "repository": "https://github.com/qualcomm/qcom-test-automation-controller.git", "commit": "757cc972c88e4a1098881b2bc73f3d53eac286be", "path": "configurations", "file": "TAC_FTDI_78.tcnf" }, "platform_id": 78, "name": "Maili CDP8950", "platform_type": "FTDI", "description": "ALPACA-LITE MAILI CDP", "usb_descriptor": "ALPACA-LITE MAILI CDP", "reset_enabled": false, "chip_count": 1, "script": "def powerOffTheDevice() \n\tlogComment ====== powerOffTheDevice sequence start ======\n\n\tbattery 1\n\tusb0 1\n\t//usb1 1\n\n\tlogComment ====== powerOffTheDevice sequence finish ======\n\ndef powerOnTheDevice()\n\tlogComment ====== powerOnTheDevice sequence start ======\n\n\tdelay 500\n\tbattery 0\n\tdelay 900\n\tusb0 0\n\t//usb1 0\n\tdelay 30\n\n\tlogComment ====== powerOnTheDevice sequence finish ======\n\ndef powerOff()\n\tlogComment ====== powerOff start ======\n\n\tpowerOffTheDevice\n\n\tpkey 0\n\tvolup 0\n\tvoldn 0\n\n\tpedl 0\n\n\tlogComment ====== powerOff finish ======\n\ndef powerOn()\n\tlogComment ====== powerOn start ======\n\n\tpowerOff\n\n\tpowerOnTheDevice\n\n\tpkey 1\n\tdelay 3500\n\t//EUFI requires > 3sec delay between power/pkey\n\tpkey 0\n\n\tlogComment ====== powerOn finish ======\n\ndef bootToEDL()\n\tlogComment ====== bootToEDL start ======\n\n\tpowerOffTheDevice\n\n\tpkey 0\n\tvolup 0\n\tvoldn 0\n\n\tpedl 1\n\n\tpowerOnTheDevice\n\n\tpkey 1\n\tdelay 1300\n\tpkey 0\n\n\tpedl 0\n\n\tlogComment ====== bootToEDL finish ======\n\ndef bootToUEFI()\n\tlogComment ====== bootToUEFIMenu start ======\n\n\tpowerOffTheDevice\n\n\t// Put buttons in a set state\n\tpkey 0\n\tvolup 1\n\tvoldn 0\n\n\tpedl 0\n\n\tpowerOnTheDevice\n\n\tpkey 1\n\tdelay 8000\n\tpkey 0\n\tvolup 0\n\tdelay 12\n\tpkey 1\n\n\tpkey 0\n\tvolup 0\n\n\tlogComment ====== bootToUEFIMenu finish ======\n\ndef bootToFastboot()\n\tlogComment ====== bootToFastboot start ======\n\n\tpowerOffTheDevice\n\n\tpkey 0\n\tvolup 0\n\tvoldn 1\n\n\tpedl 0\n\n\tpowerOnTheDevice\n\n\tpkey 1\n\tdelay 2000\n\tpkey 0\n\n\tdelay 6000\n\tvoldn 0\n\tdelay 30\n\tvoldn 1\n\n\tvoldn 0\n\n\tlogComment ====== bootToFastboot finished ======\n", "bus": [ { "bus": "A", "bus_function": 1, "chip_index": 0 }, { "bus": "B", "bus_function": 1, "chip_index": 0 }, { "bus": "C", "bus_function": 2, "chip_index": 0 }, { "bus": "D", "bus_function": 2, "chip_index": 0 } ], "pins": [ { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "0", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "0", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "pshold", "initial_value": false, "input": false, "inverted": false, "pin_number": "0", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "volup", "initial_value": false, "input": false, "inverted": false, "pin_number": "0", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "1", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "1", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "mode0", "initial_value": false, "input": false, "inverted": false, "pin_number": "1", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "battery", "initial_value": false, "input": false, "inverted": true, "pin_number": "1", "priority": 2 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "2", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "2", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "gg2", "initial_value": false, "input": false, "inverted": false, "pin_number": "2", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "voldn", "initial_value": false, "input": false, "inverted": false, "pin_number": "2", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "3", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "3", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "mode1", "initial_value": false, "input": false, "inverted": false, "pin_number": "3", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "pkey", "initial_value": false, "input": false, "inverted": false, "pin_number": "3", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "4", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "4", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "sdcard", "initial_value": false, "input": false, "inverted": false, "pin_number": "4", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "eud", "initial_value": false, "input": false, "inverted": false, "pin_number": "4", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "5", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "5", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "gg1", "initial_value": false, "input": false, "inverted": false, "pin_number": "5", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "pedl", "initial_value": false, "input": false, "inverted": false, "pin_number": "5", "priority": -1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "6", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "6", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "gg3", "initial_value": false, "input": false, "inverted": false, "pin_number": "6", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "TC_READY_N", "initial_value": true, "input": false, "inverted": false, "pin_number": "6", "priority": 1 }, { "bus": "A", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "7", "priority": -1 }, { "bus": "B", "chip_index": 0, "command": "", "initial_value": false, "input": false, "inverted": false, "pin_number": "7", "priority": -1 }, { "bus": "C", "chip_index": 0, "command": "sresn", "initial_value": false, "input": false, "inverted": false, "pin_number": "7", "priority": -1 }, { "bus": "D", "chip_index": 0, "command": "usb0", "initial_value": false, "input": false, "inverted": true, "pin_number": "7", "priority": 2 } ], "variables": [] } pytactl-3.2/pytactl/tac_configs/TAC_PIC32CXAuto_54.pinout.json000066400000000000000000000163741526550266300240750ustar00rootroot00000000000000{ "$schema": "https://qualcomm.github.io/tac/schemas/pinout-1.0.json", "format": "tac-pinout", "schema_version": "1.0", "source": { "repository": "https://github.com/qualcomm/qcom-test-automation-controller.git", "commit": "757cc972c88e4a1098881b2bc73f3d53eac286be", "path": "configurations", "file": "TAC_PIC32CXAuto_54.tcnf" }, "description": "NordAu RIDE", "name": "NordAu RIDE", "platform_id": 54, "platform_type": "PIC32CXAuto", "reset_enabled": false, "script": "def powerOff()\r\n\tlogComment ====== powerOff start ======\r\n\r\n\r\n\tbattery 1\r\n\r\n\r\n\tlogComment ====== powerOff finish ======\r\n\r\ndef powerOn()\r\n\tlogComment ====== powerOn start ======\r\n\r\n\r\n\tbattery 1\r\n\tdelay 900\r\n\tbattery 0\r\n\r\n\tlogComment ====== powerOn finish ======\r\n\r\ndef bootToEDL()\r\n\tlogComment ====== bootToEDL start ======\r\n\r\n\tsedl 0\r\n\tuefi 0\r\n\tbattery 1\r\n\tpedl 1\r\n\tdelay 900\r\n\tbattery 0\r\n\tdelay $edl\r\n\tpedl 0\r\n\r\n\tlogComment ====== bootToEDL finish ======\r\n\r\ndef bootToSecondaryEDL()\r\n\tlogComment ====== bootToSecondaryEDL start ======\r\n\r\n\tpedl 0\r\n\tuefi 0\r\n\tbattery 1\r\n\tsedl 1\r\n\tdelay 900\r\n\tbattery 0\r\n\tdelay $edl\r\n\tsedl 0\r\n\r\n\tlogComment ====== bootToSecondaryEDL finish ======\r\n\r\ndef bootToUEFI()\r\n\tlogComment ====== bootToUEFIMenu start ======\r\n\r\n\tkkpwr 1\r\n\tuefi 1\r\n\tbattery 1\r\n\tdelay 900\r\n\tbattery 0\r\n\tdelay $uefi\r\n\tuefi 0\r\n\tkkpwr 0\r\n\r\ndef bootToFastboot()\r\n\tlogComment ====== bootToFastboot start ======\r\n\r\n\tpedl 0\r\n\tsedl 0\r\n\tuefi 0\r\n\tsfastboot 0\r\n\tbattery 1\r\n\tfastboot 1\r\n\tdelay 900\r\n\tbattery 0\r\n\tdelay $fastboot\r\n\tfastboot 0\r\n\r\n\tlogComment ====== bootToFastboot finished ======\r\n\r\ndef bootToSecondaryFastboot()\r\n\tlogComment ====== bootToSecondaryFastboot start ======\r\n\r\n\tpedl 0\r\n\tsedl 0\r\n\tuefi 0\r\n\tbattery 1\r\n\tsfastboot 1\r\n\tfastboot 1\r\n\tdelay 900\r\n\tbattery 0\r\n\tdelay $fastboot\r\n\tsfastboot 0\r\n\tfastboot 0\r\n\r\n\tlogComment ====== bootToSecondaryFastboot finished ======\r\n", "usb_descriptor": "KARUSSELL", "pins": [ { "command": "kratos", "inverted": false, "pin_number": 110 }, { "command": "forcemdpshold", "inverted": false, "pin_number": 120 }, { "command": "iic7", "inverted": false, "pin_number": 320 }, { "command": "pcie2", "inverted": false, "pin_number": 101 }, { "command": "iic4", "inverted": false, "pin_number": 111 }, { "command": "eud", "inverted": false, "pin_number": 311 }, { "command": "forcesspshold", "inverted": false, "pin_number": 121 }, { "command": "iic13", "inverted": false, "pin_number": 221 }, { "command": "fastboot", "inverted": false, "pin_number": 321 }, { "command": "pcie3", "inverted": false, "pin_number": 102 }, { "command": "usb1", "inverted": false, "pin_number": 312 }, { "command": "iic10", "inverted": false, "pin_number": 103 }, { "command": "", "inverted": false, "pin_number": 123 }, { "command": "", "inverted": false, "pin_number": 204 }, { "command": "qccbld", "inverted": false, "pin_number": 114 }, { "command": "inputpoff", "inverted": false, "pin_number": 224 }, { "command": "usb2", "inverted": false, "pin_number": 205 }, { "command": "bbbld", "inverted": false, "pin_number": 115 }, { "command": "mode1", "inverted": false, "pin_number": 215 }, { "command": "inputpms", "inverted": false, "pin_number": 225 }, { "command": "inputpwr", "inverted": false, "pin_number": 206 }, { "command": "sfastboot", "inverted": false, "pin_number": 116 }, { "command": "pedl", "inverted": false, "pin_number": 216 }, { "command": "pcie0", "inverted": false, "pin_number": 226 }, { "command": "mode0", "inverted": false, "pin_number": 207 }, { "command": "iic5", "inverted": false, "pin_number": 117 }, { "command": "mode0", "inverted": false, "pin_number": 217 }, { "command": "qccblden", "inverted": false, "pin_number": 227 }, { "command": "sbattery", "inverted": false, "pin_number": 118 }, { "command": "usb0", "inverted": false, "pin_number": 128 }, { "command": "mode2", "inverted": false, "pin_number": 228 }, { "command": "spshold", "inverted": false, "pin_number": 119 }, { "command": "sedl", "inverted": false, "pin_number": 219 }, { "command": "pgood", "inverted": false, "pin_number": 129 }, { "command": "sresn", "inverted": false, "pin_number": 10 }, { "command": "pkey", "inverted": false, "pin_number": 20 }, { "command": "pmspwr", "inverted": false, "pin_number": 11 }, { "command": "uefi", "inverted": false, "pin_number": 16 }, { "command": "pcie1", "inverted": false, "pin_number": 27 }, { "command": "iic2", "inverted": false, "pin_number": 3 }, { "command": "battery", "inverted": true, "pin_number": 4 }, { "command": "kkpwr", "inverted": false, "pin_number": 6 }, { "command": "pshold", "inverted": false, "pin_number": 7 } ], "variables": [ { "default_value": "2500", "name": "edl" }, { "default_value": "12000", "name": "fastboot" }, { "default_value": "13000", "name": "uefi" } ] } pytactl-3.2/pytactl/tac_configs/TAC_PIC32CXAuto_81.pinout.json000066400000000000000000000164021526550266300240650ustar00rootroot00000000000000{ "$schema": "https://qualcomm.github.io/tac/schemas/pinout-1.0.json", "format": "tac-pinout", "schema_version": "1.0", "source": { "repository": "https://github.com/qualcomm/qcom-test-automation-controller.git", "commit": "954c804e694e8b7d7e8fc71c105d66c3f4742d20", "path": "configurations", "file": "TAC_PIC32CXAuto_81.tcnf" }, "description": "Seca CoB STAR", "name": "Seca CoB STAR", "platform_id": 81, "platform_type": "PIC32CXAuto", "reset_enabled": false, "script": "def powerOff()\r\n\tlogComment ====== powerOff start ======\r\n\r\n\r\n\tbattery 1\r\n\r\n\r\n\tlogComment ====== powerOff finish ======\r\n\r\ndef powerOn()\r\n\tlogComment ====== powerOn start ======\r\n\r\n\r\n\tbattery 1\r\n\tdelay 900\r\n\tbattery 0\r\n\r\n\tlogComment ====== powerOn finish ======\r\n\r\ndef bootToEDL()\r\n\tlogComment ====== bootToEDL start ======\r\n\r\n\tsedl 0\r\n\tuefi 0\r\n\tbattery 1\r\n\tpedl 1\r\n\tdelay 900\r\n\tbattery 0\r\n\tdelay $edl\r\n\tpedl 0\r\n\r\n\tlogComment ====== bootToEDL finish ======\r\n\r\ndef bootToSecondaryEDL()\r\n\tlogComment ====== bootToSecondaryEDL start ======\r\n\r\n\tpedl 0\r\n\tuefi 0\r\n\tbattery 1\r\n\tsedl 1\r\n\tdelay 900\r\n\tbattery 0\r\n\tdelay $edl\r\n\tsedl 0\r\n\r\n\tlogComment ====== bootToSecondaryEDL finish ======\r\n\r\ndef bootToUEFI()\r\n\tlogComment ====== bootToUEFIMenu start ======\r\n\r\n\tkkpwr 1\r\n\tuefi 1\r\n\tbattery 1\r\n\tdelay 900\r\n\tbattery 0\r\n\tdelay $uefi\r\n\tuefi 0\r\n\tkkpwr 0\r\n\r\ndef bootToFastboot()\r\n\tlogComment ====== bootToFastboot start ======\r\n\r\n\tpedl 0\r\n\tsedl 0\r\n\tuefi 0\r\n\tsfastboot 0\r\n\tbattery 1\r\n\tfastboot 1\r\n\tdelay 900\r\n\tbattery 0\r\n\tdelay $fastboot\r\n\tfastboot 0\r\n\r\n\tlogComment ====== bootToFastboot finished ======\r\n\r\ndef bootToSecondaryFastboot()\r\n\tlogComment ====== bootToSecondaryFastboot start ======\r\n\r\n\tpedl 0\r\n\tsedl 0\r\n\tuefi 0\r\n\tbattery 1\r\n\tsfastboot 1\r\n\tfastboot 1\r\n\tdelay 900\r\n\tbattery 0\r\n\tdelay $fastboot\r\n\tsfastboot 0\r\n\tfastboot 0\r\n\r\n\tlogComment ====== bootToSecondaryFastboot finished ======\r\n", "usb_descriptor": "TORO", "pins": [ { "command": "kratos", "inverted": false, "pin_number": 110 }, { "command": "forcemdpshold", "inverted": false, "pin_number": 120 }, { "command": "iic7", "inverted": false, "pin_number": 320 }, { "command": "pcie2", "inverted": false, "pin_number": 101 }, { "command": "iic4", "inverted": false, "pin_number": 111 }, { "command": "eud", "inverted": false, "pin_number": 311 }, { "command": "forcesspshold", "inverted": false, "pin_number": 121 }, { "command": "iic13", "inverted": false, "pin_number": 221 }, { "command": "fastboot", "inverted": false, "pin_number": 321 }, { "command": "pcie3", "inverted": false, "pin_number": 102 }, { "command": "usb1", "inverted": false, "pin_number": 312 }, { "command": "iic10", "inverted": false, "pin_number": 103 }, { "command": "", "inverted": false, "pin_number": 123 }, { "command": "", "inverted": false, "pin_number": 204 }, { "command": "qccbld", "inverted": false, "pin_number": 114 }, { "command": "inputpoff", "inverted": false, "pin_number": 224 }, { "command": "usb2", "inverted": false, "pin_number": 205 }, { "command": "bbbld", "inverted": false, "pin_number": 115 }, { "command": "mode1", "inverted": false, "pin_number": 215 }, { "command": "inputpms", "inverted": false, "pin_number": 225 }, { "command": "inputpwr", "inverted": false, "pin_number": 206 }, { "command": "sfastboot", "inverted": false, "pin_number": 116 }, { "command": "pedl", "inverted": false, "pin_number": 216 }, { "command": "bbblden", "inverted": false, "pin_number": 226 }, { "command": "mode0", "inverted": false, "pin_number": 207 }, { "command": "iic5", "inverted": false, "pin_number": 117 }, { "command": "qccblden", "inverted": false, "pin_number": 227 }, { "command": "inputvr4p5", "inverted": false, "pin_number": 118 }, { "command": "usb0", "inverted": false, "pin_number": 128 }, { "command": "mode2", "inverted": false, "pin_number": 228 }, { "command": "inputvr3p3", "inverted": false, "pin_number": 119 }, { "command": "sedl", "inverted": false, "pin_number": 219 }, { "command": "pgood", "inverted": false, "pin_number": 129 }, { "command": "sresn", "inverted": false, "pin_number": 10 }, { "command": "pkey", "inverted": false, "pin_number": 20 }, { "command": "pmspwr", "inverted": false, "pin_number": 11 }, { "command": "pcie0", "inverted": false, "pin_number": 21 }, { "command": "uefi", "inverted": false, "pin_number": 16 }, { "command": "pcie1", "inverted": false, "pin_number": 27 }, { "command": "iic2", "inverted": false, "pin_number": 3 }, { "command": "battery", "inverted": false, "pin_number": 4 }, { "command": "kkpwr", "inverted": false, "pin_number": 6 }, { "command": "pshold", "inverted": false, "pin_number": 7 } ], "variables": [ { "default_value": "1500", "name": "edl" }, { "default_value": "10000", "name": "fastboot" }, { "default_value": "10000", "name": "uefi" } ] } pytactl-3.2/pytactl/tac_configs/TAC_PIC32CXAuto_85.pinout.json000066400000000000000000000167441526550266300241020ustar00rootroot00000000000000{ "$schema": "https://qualcomm.github.io/tac/schemas/pinout-1.0.json", "format": "tac-pinout", "schema_version": "1.0", "source": { "repository": "https://github.com/qualcomm/qcom-test-automation-controller.git", "commit": "954c804e694e8b7d7e8fc71c105d66c3f4742d20", "path": "configurations", "file": "TAC_PIC32CXAuto_85.tcnf" }, "description": "IQ10 RRD V1", "name": "IQ10 RRD V1", "platform_id": 85, "platform_type": "PIC32CXAuto", "reset_enabled": false, "script": "def powerOff()\r\n\tlogComment ====== powerOff start ======\r\n\r\n\r\n\tbattery 1\r\n\r\n\r\n\tlogComment ====== powerOff finish ======\r\n\r\ndef powerOn()\r\n\tlogComment ====== powerOn start ======\r\n\r\n\r\n\tbattery 1\r\n\tdelay 900\r\n\tbattery 0\r\n\r\n\tlogComment ====== powerOn finish ======\r\n\r\ndef bootToEDL()\r\n\tlogComment ====== bootToEDL start ======\r\n\r\n\tsedl 0\r\n\tuefi 0\r\n\tbattery 1\r\n\tpedl 1\r\n\tdelay 900\r\n\tbattery 0\r\n\tdelay $edl\r\n\tpedl 0\r\n\r\n\tlogComment ====== bootToEDL finish ======\r\n\r\ndef bootToSecondaryEDL()\r\n\tlogComment ====== bootToSecondaryEDL start ======\r\n\r\n\tpedl 0\r\n\tuefi 0\r\n\tbattery 1\r\n\tsedl 1\r\n\tdelay 900\r\n\tbattery 0\r\n\tdelay $edl\r\n\tsedl 0\r\n\r\n\tlogComment ====== bootToSecondaryEDL finish ======\r\n\r\ndef bootToUEFI()\r\n\tlogComment ====== bootToUEFIMenu start ======\r\n\r\n\tkkpwr 1\r\n\tuefi 1\r\n\tbattery 1\r\n\tdelay 900\r\n\tbattery 0\r\n\tdelay $uefi\r\n\tuefi 0\r\n\tkkpwr 0\r\n\r\ndef bootToFastboot()\r\n\tlogComment ====== bootToFastboot start ======\r\n\r\n\tpedl 0\r\n\tsedl 0\r\n\tuefi 0\r\n\tsfastboot 0\r\n\tbattery 1\r\n\tfastboot 1\r\n\tdelay 900\r\n\tbattery 0\r\n\tdelay $fastboot\r\n\tfastboot 0\r\n\r\n\tlogComment ====== bootToFastboot finished ======\r\n\r\ndef bootToSecondaryFastboot()\r\n\tlogComment ====== bootToSecondaryFastboot start ======\r\n\r\n\tpedl 0\r\n\tsedl 0\r\n\tuefi 0\r\n\tbattery 1\r\n\tsfastboot 1\r\n\tfastboot 1\r\n\tdelay 900\r\n\tbattery 0\r\n\tdelay $fastboot\r\n\tsfastboot 0\r\n\tfastboot 0\r\n\r\n\tlogComment ====== bootToSecondaryFastboot finished ======\r\n", "usb_descriptor": "IQ10rrd", "pins": [ { "command": "kratos", "inverted": false, "pin_number": 110 }, { "command": "forcemdpshold", "inverted": false, "pin_number": 120 }, { "command": "iic7", "inverted": false, "pin_number": 320 }, { "command": "pcie2", "inverted": false, "pin_number": 101 }, { "command": "iic4", "inverted": false, "pin_number": 111 }, { "command": "eud", "inverted": false, "pin_number": 311 }, { "command": "forcesspshold", "inverted": false, "pin_number": 121 }, { "command": "iic13", "inverted": false, "pin_number": 221 }, { "command": "fastboot", "inverted": false, "pin_number": 321 }, { "command": "pcie3", "inverted": false, "pin_number": 102 }, { "command": "usb1", "inverted": false, "pin_number": 312 }, { "command": "iic10", "inverted": false, "pin_number": 103 }, { "command": "", "inverted": false, "pin_number": 123 }, { "command": "", "inverted": false, "pin_number": 204 }, { "command": "qccbld", "inverted": false, "pin_number": 114 }, { "command": "inputpoff", "inverted": false, "pin_number": 224 }, { "command": "usb2", "inverted": false, "pin_number": 205 }, { "command": "bbbld", "inverted": false, "pin_number": 115 }, { "command": "mode1", "inverted": false, "pin_number": 215 }, { "command": "inputpms", "inverted": false, "pin_number": 225 }, { "command": "inputpwr", "inverted": false, "pin_number": 206 }, { "command": "sfastboot", "inverted": false, "pin_number": 116 }, { "command": "pedl", "inverted": false, "pin_number": 216 }, { "command": "bbblden", "inverted": false, "pin_number": 226 }, { "command": "mode0", "inverted": false, "pin_number": 207 }, { "command": "iic5", "inverted": false, "pin_number": 117 }, { "command": "mode0", "inverted": false, "pin_number": 217 }, { "command": "qccblden", "inverted": false, "pin_number": 227 }, { "command": "inputvr4p5", "inverted": false, "pin_number": 118 }, { "command": "usb0", "inverted": false, "pin_number": 128 }, { "command": "mode2", "inverted": false, "pin_number": 228 }, { "command": "inputvr3p3", "inverted": false, "pin_number": 119 }, { "command": "sedl", "inverted": false, "pin_number": 219 }, { "command": "pgood", "inverted": false, "pin_number": 129 }, { "command": "sresn", "inverted": false, "pin_number": 10 }, { "command": "pkey", "inverted": false, "pin_number": 20 }, { "command": "pmspwr", "inverted": false, "pin_number": 11 }, { "command": "pcie0", "inverted": false, "pin_number": 21 }, { "command": "uefi", "inverted": false, "pin_number": 16 }, { "command": "pcie1", "inverted": false, "pin_number": 27 }, { "command": "pshold", "inverted": false, "pin_number": 0 }, { "command": "iic2", "inverted": false, "pin_number": 3 }, { "command": "battery", "inverted": false, "pin_number": 4 }, { "command": "kkpwr", "inverted": false, "pin_number": 6 }, { "command": "pshold", "inverted": false, "pin_number": 7 } ], "variables": [ { "default_value": "2500", "name": "edl" }, { "default_value": "12000", "name": "fastboot" }, { "default_value": "13000", "name": "uefi" } ] } pytactl-3.2/pytactl/tac_configs/TAC_PSOC_14.pinout.json000066400000000000000000000157361526550266300227720ustar00rootroot00000000000000{ "$schema": "https://qualcomm.github.io/tac/schemas/pinout-1.0.json", "format": "tac-pinout", "schema_version": "1.0", "source": { "repository": "https://github.com/qualcomm/qcom-test-automation-controller.git", "commit": "757cc972c88e4a1098881b2bc73f3d53eac286be", "path": "configurations", "file": "TAC_PSOC_14.tcnf" }, "description": "CSM - PSoC version", "name": "CSM - PSoC", "platform_id": 14, "platform_type": "PSOC", "reset_enabled": true, "script": "def powerOffTheDevice() \n\tlogComment ====== powerOffTheDevice sequence start ======\n\n\tbattery 1\n\tpkey 0\n\t\n\tlogComment ====== powerOffTheDevice sequence finish ======\n\ndef powerOnTheDevice()\n\tlogComment ====== powerOnTheDevice sequence start ======\n\n\tdelay 500\n\tbattery 0\n\tpkey 1\n\tdelay 900\n\t\n\n\tlogComment ====== powerOnTheDevice sequence finish ======\n\n\ndef powerOff()\n\tlogComment ====== powerOff start ======\n\n\tpowerOffTheDevice\n\n\tpkey 0\n\tpedl 0\n\n\tlogComment ====== powerOff finish ======\n\ndef powerOn()\n\tlogComment ====== powerOn start ======\n\t\n\tpowerOnTheDevice\n\t\n\tdelay 500\n\n\tpkey 1\n\tpkey 0\n\tlogComment ====== powerOn finish ======\n\n\ndef bootToEDL()\n\tlogComment ====== bootToEDL start ======\n\n\tpowerOffTheDevice\n\tpedl 1\n\tpowerOnTheDevice\n\tdelay 3000\n\tpedl 0\n\n\tlogComment ====== bootToEDL finish ======\n\ndef bootToEUD()\n\tlogComment ====== bootToEUD start ======\n\n\tpowerOffTheDevice\n\teud 1\n\tpowerOnTheDevice\n\tdelay 3000\n\teud 0\n\n\tlogComment ====== bootToEUD finish ======\n\ndef bootToUEFI()\n\tlogComment ====== bootToUEFIMenu start ======\n\n\tpowerOffTheDevice\n\tpowerOnTheDevice\n\tdelay 2100\n\tpkey 0\n\n\tlogComment ====== bootToUEFIMenu finish ======\n\ndef bootToFastboot()\n\tlogComment ====== bootToFastBoot start ======\n\n\tpowerOffTheDevice\n\tpowerOnTheDevice\n\tdelay 3100\n\tpkey 0\n\n\tlogComment ====== bootToFastBoot finished ======\n", "supportedFirmwareVer": [ 15 ], "usb_descriptor": "", "pins": [ { "classic_action": "TAC_SOFT_RESET", "command": "softreset", "initial_value": false, "initialization_priority": 99, "inverted": false, "pin_number": "15" }, { "classic_action": "TC_EUD_EARLY_BOOT_EN", "command": "eud", "initial_value": false, "initialization_priority": 99, "inverted": false, "pin_number": "16" }, { "classic_action": "TAC_UIM1_DIS", "command": "uim1", "initial_value": false, "initialization_priority": 99, "inverted": false, "pin_number": "18" }, { "classic_action": "TAC_UIM2_DIS", "command": "uim2", "initial_value": false, "initialization_priority": 99, "inverted": false, "pin_number": "19" }, { "classic_action": "TAC_HEADSET_DIS", "command": "headset", "initial_value": false, "initialization_priority": 99, "inverted": false, "pin_number": "21" }, { "classic_action": "", "command": "lowcurrentmode", "initial_value": false, "initialization_priority": 99, "inverted": false, "pin_number": "29" }, { "classic_action": "TAC_FORCE_USB_BOOT_SEC", "command": "sedl", "initial_value": false, "initialization_priority": 99, "inverted": false, "pin_number": "30" }, { "classic_action": "TAC_RESET_SEC", "command": "sresn", "initial_value": false, "initialization_priority": 99, "inverted": false, "pin_number": "31" }, { "classic_action": "TAC_VOL_UP", "command": "volup", "initial_value": false, "initialization_priority": 99, "inverted": false, "pin_number": "34" }, { "classic_action": "TAC_USB1_DIS", "command": "usb1", "initial_value": false, "initialization_priority": 99, "inverted": false, "pin_number": "36" }, { "classic_action": "TAC_FORCE_PS_HOLD", "command": "pshold", "initial_value": false, "initialization_priority": 99, "inverted": false, "pin_number": "37" }, { "classic_action": "", "command": "BC_5", "initial_value": false, "initialization_priority": 99, "inverted": false, "pin_number": "38" }, { "classic_action": "", "command": "BC_6", "initial_value": false, "initialization_priority": 99, "inverted": false, "pin_number": "39" }, { "classic_action": "", "command": "RF_DIS", "initial_value": false, "initialization_priority": 99, "inverted": false, "pin_number": "46" }, { "classic_action": "", "command": "sdcarddis", "initial_value": false, "initialization_priority": 99, "inverted": false, "pin_number": "47" }, { "classic_action": "TAC_TC_START", "command": "pkey", "initial_value": false, "initialization_priority": 99, "inverted": false, "pin_number": "50" }, { "classic_action": "TAC_RESET_PRI", "command": "voldn", "initial_value": false, "initialization_priority": 99, "inverted": false, "pin_number": "51" }, { "classic_action": "TAC_POWER_OFF", "command": "battery", "initial_value": false, "initialization_priority": 99, "inverted": true, "pin_number": "53" }, { "classic_action": "TAC_SW_DWNLD_PRI", "command": "pedl", "initial_value": false, "initialization_priority": 99, "inverted": false, "pin_number": "54" }, { "classic_action": "TAC_USB0_DIS", "command": "usb0", "initial_value": false, "initialization_priority": 99, "inverted": false, "pin_number": "55" }, { "classic_action": "TAC_READY_N", "command": "ready", "initial_value": false, "initialization_priority": 1, "inverted": false, "pin_number": "56" } ], "variables": [] } pytactl-3.2/pytactl/tac_configs/TAC_PSOC_17.pinout.json000066400000000000000000000146651526550266300227750ustar00rootroot00000000000000{ "$schema": "https://qualcomm.github.io/tac/schemas/pinout-1.0.json", "format": "tac-pinout", "schema_version": "1.0", "source": { "repository": "https://github.com/qualcomm/qcom-test-automation-controller.git", "commit": "757cc972c88e4a1098881b2bc73f3d53eac286be", "path": "configurations", "file": "TAC_PSOC_17.tcnf" }, "description": "Lemans ADP TAC PSOC", "name": "Lemans ADP Automotive", "platform_id": 17, "platform_type": "PSOC", "reset_enabled": false, "script": "def powerOff() \n\tlogComment ====== powerOffTheDevice sequence start ======\n\n\tbattery 1\n\n\tlogComment ====== powerOffTheDevice sequence finish ======\n\n\ndef powerOn()\n\tlogComment ====== powerOnTheDevice sequence start ======\n\n\tbattery 0\n\n\tlogComment ====== powerOnTheDevice sequence finish ======\n\n\ndef reset()\n\tlogComment ====== reset start ======\n\n\tpowerOff\n\tdelay 1500\n\tpowerOn\n\n\tlogComment ====== reset finish ======\n\n\ndef bootToEDL()\n\tlogComment ====== s1_md_sail_edl start ======\n\n\tpowerOff\n\tpedl 1\n\tsdcard 1\n\tdelay 1500\n\tpowerOn\n\tdelay 5000\n\tdelay $Optional_GPIO_Hold_Time\n\tpedl 0\n\tsdcard 0\n\n\tlogComment ====== s1_md_sail_edl finish ======\n\n\ndef bootToUEFI()\n\tlogComment ====== s1_uefi start ======\n\n\treset\n\tvolup 1\n\tdelay 1000\n\tpkey 1\n\tvoldn 0\n\tpedl 0\n\tdelay 8000\n\tdelay $Optional_GPIO_Hold_Time\n\tpkey 0\n\tvolup 0\n\tdelay 12\n\tpkey 1\n\tvolup 1\n\tpkey 0\n\tvolup 0 \n\n\tlogComment ======s1_uefi finish ======\n\n\ndef bootToFastboot()\n\tlogComment ====== s1_fastboot start ======\n\n\tpowerOff\n\tvoldn 1\n\tdelay 1500\n\tpowerOn\n\tdelay 8000\n\tdelay $Optional_GPIO_Hold_Time\n\tvoldn 0\n\n\tlogComment ====== s1_fastboot finish ======\n", "supportedFirmwareVer": [ 15 ], "usb_descriptor": "", "pins": [ { "classic_action": "TAC_SOFT_RESET", "command": "eud", "initial_value": false, "initialization_priority": -1, "inverted": false, "pin_number": "15" }, { "classic_action": "TC_EUD_EARLY_BOOT_EN", "command": "", "initial_value": false, "initialization_priority": -1, "inverted": false, "pin_number": "16" }, { "classic_action": "TAC_UIM1_DIS", "command": "uim1", "initial_value": false, "initialization_priority": -1, "inverted": false, "pin_number": "18" }, { "classic_action": "TAC_UIM2_DIS", "command": "uim2", "initial_value": false, "initialization_priority": -1, "inverted": false, "pin_number": "19" }, { "classic_action": "TAC_HEADSET_DIS", "command": "headset", "initial_value": false, "initialization_priority": -1, "inverted": false, "pin_number": "21" }, { "classic_action": "", "command": "uart_dis", "initial_value": false, "initialization_priority": -1, "inverted": false, "pin_number": "29" }, { "classic_action": "TAC_FORCE_USB_BOOT_SEC", "command": "sedl", "initial_value": false, "initialization_priority": -1, "inverted": false, "pin_number": "30" }, { "classic_action": "TAC_RESET_SEC", "command": "sdcard", "initial_value": false, "initialization_priority": -1, "inverted": false, "pin_number": "31" }, { "classic_action": "TAC_VOL_UP", "command": "volup", "initial_value": false, "initialization_priority": -1, "inverted": false, "pin_number": "34" }, { "classic_action": "TAC_USB1_DIS", "command": "usb1", "initial_value": false, "initialization_priority": 2, "inverted": true, "pin_number": "36" }, { "classic_action": "TAC_FORCE_PS_HOLD", "command": "", "initial_value": false, "initialization_priority": -1, "inverted": false, "pin_number": "37" }, { "classic_action": "", "command": "pshold", "initial_value": false, "initialization_priority": -1, "inverted": false, "pin_number": "38" }, { "classic_action": "", "command": "sresn", "initial_value": false, "initialization_priority": -1, "inverted": false, "pin_number": "39" }, { "classic_action": "", "command": "", "initial_value": false, "initialization_priority": -1, "inverted": false, "pin_number": "46" }, { "classic_action": "TAC_TC_START", "command": "pkey", "initial_value": false, "initialization_priority": -1, "inverted": false, "pin_number": "50" }, { "classic_action": "TAC_RESET_PRI", "command": "voldn", "initial_value": false, "initialization_priority": -1, "inverted": false, "pin_number": "51" }, { "classic_action": "TAC_POWER_OFF", "command": "battery", "initial_value": false, "initialization_priority": 2, "inverted": true, "pin_number": "53" }, { "classic_action": "TAC_SW_DWNLD_PRI", "command": "pedl", "initial_value": false, "initialization_priority": -1, "inverted": false, "pin_number": "54" }, { "classic_action": "TAC_USB0_DIS", "command": "usb0", "initial_value": false, "initialization_priority": 2, "inverted": true, "pin_number": "55" } ], "variables": [ { "default_value": "0", "name": "Optional_GPIO_Hold_Time" } ] } pytactl-3.2/pytactl/tac_configs/TAC_PSOC_24.pinout.json000066400000000000000000000154451526550266300227700ustar00rootroot00000000000000{ "$schema": "https://qualcomm.github.io/tac/schemas/pinout-1.0.json", "format": "tac-pinout", "schema_version": "1.0", "source": { "repository": "https://github.com/qualcomm/qcom-test-automation-controller.git", "commit": "757cc972c88e4a1098881b2bc73f3d53eac286be", "path": "configurations", "file": "TAC_PSOC_24.tcnf" }, "description": "CSM - PSoC version", "name": "CSM - X100 - PSoC", "platform_id": 24, "platform_type": "PSOC", "reset_enabled": true, "script": "def powerOffTheDevice() \n\tlogComment ====== powerOffTheDevice sequence start ======\n\n\tbattery 1\n\tpkey 0\n\t\n\tlogComment ====== powerOffTheDevice sequence finish ======\n\ndef powerOnTheDevice()\n\tlogComment ====== powerOnTheDevice sequence start ======\n\n\tdelay 500\n\tbattery 0\n\tpkey 1\n\tdelay 900\n\t\n\n\tlogComment ====== powerOnTheDevice sequence finish ======\n\n\ndef bootToEDL()\n\tlogComment ====== bootToEDL start ======\n\n\tpowerOffTheDevice\n\tpedl 1\n\tpowerOnTheDevice\n\tdelay 3000\n\tpedl 0\n\n\tlogComment ====== bootToEDL finish ======\n\ndef bootToEUD()\n\tlogComment ====== bootToEUD start ======\n\n\tpowerOffTheDevice\n\teud 1\n\tpowerOnTheDevice\n\tdelay 3000\n\teud 0\n\n\tlogComment ====== bootToEUD finish ======\n\ndef bootToUEFIMenu()\n\tlogComment ====== bootToUEFIMenu start ======\n\n\tpowerOffTheDevice\n\tpowerOnTheDevice\n\tdelay 2000\n\tpkey 0\n\n\tlogComment ====== bootToUEFIMenu finish ======\n\ndef bootToFastBoot()\n\tlogComment ====== bootToFastBoot start ======\n\n\tpowerOffTheDevice\n\n\tpkey 0\n\tvolup 0\n\tvoldn 1\n\n\tpedl 0\n\n\tpowerOnTheDevice\n\n\tpkey 1\n\tdelay 8000\n\tpkey 0\n\n\tdelay 8000\n\tvoldn 0\n\tdelay 30\n\tvoldn 1\n\n\tvoldn 0\n\n\tlogComment ====== bootToFastBoot finished ======\n", "supportedFirmwareVer": [ 15 ], "usb_descriptor": "", "pins": [ { "classic_action": "TAC_SOFT_RESET", "command": "softreset", "initial_value": false, "initialization_priority": 99, "inverted": false, "pin_number": "15" }, { "classic_action": "TC_EUD_EARLY_BOOT_EN", "command": "eud", "initial_value": false, "initialization_priority": 99, "inverted": false, "pin_number": "16" }, { "classic_action": "TAC_UIM1_DIS", "command": "uim1", "initial_value": false, "initialization_priority": 99, "inverted": false, "pin_number": "18" }, { "classic_action": "TAC_UIM2_DIS", "command": "uim2", "initial_value": false, "initialization_priority": 99, "inverted": false, "pin_number": "19" }, { "classic_action": "TAC_HEADSET_DIS", "command": "headset", "initial_value": false, "initialization_priority": 99, "inverted": false, "pin_number": "21" }, { "classic_action": "", "command": "lowcurrentmode", "initial_value": false, "initialization_priority": 99, "inverted": false, "pin_number": "29" }, { "classic_action": "TAC_FORCE_USB_BOOT_SEC", "command": "sedl", "initial_value": false, "initialization_priority": 99, "inverted": false, "pin_number": "30" }, { "classic_action": "TAC_RESET_SEC", "command": "sresn", "initial_value": false, "initialization_priority": 99, "inverted": false, "pin_number": "31" }, { "classic_action": "TAC_VOL_UP", "command": "volup", "initial_value": false, "initialization_priority": 99, "inverted": false, "pin_number": "34" }, { "classic_action": "TAC_USB1_DIS", "command": "usb1", "initial_value": false, "initialization_priority": 99, "inverted": false, "pin_number": "36" }, { "classic_action": "TAC_FORCE_PS_HOLD", "command": "pshold", "initial_value": false, "initialization_priority": 99, "inverted": false, "pin_number": "37" }, { "classic_action": "", "command": "BC_5", "initial_value": false, "initialization_priority": 99, "inverted": false, "pin_number": "38" }, { "classic_action": "", "command": "BC_6", "initial_value": false, "initialization_priority": 99, "inverted": false, "pin_number": "39" }, { "classic_action": "", "command": "RF_DIS", "initial_value": false, "initialization_priority": 99, "inverted": false, "pin_number": "46" }, { "classic_action": "", "command": "sdcarddis", "initial_value": false, "initialization_priority": 99, "inverted": false, "pin_number": "47" }, { "classic_action": "TAC_TC_START", "command": "pkey", "initial_value": false, "initialization_priority": 99, "inverted": false, "pin_number": "50" }, { "classic_action": "TAC_RESET_PRI", "command": "voldn", "initial_value": false, "initialization_priority": 99, "inverted": false, "pin_number": "51" }, { "classic_action": "TAC_POWER_OFF", "command": "battery", "initial_value": false, "initialization_priority": 99, "inverted": true, "pin_number": "53" }, { "classic_action": "TAC_SW_DWNLD_PRI", "command": "pedl", "initial_value": false, "initialization_priority": 99, "inverted": false, "pin_number": "54" }, { "classic_action": "TAC_USB0_DIS", "command": "usb0", "initial_value": false, "initialization_priority": 99, "inverted": false, "pin_number": "55" }, { "classic_action": "TAC_READY_N", "command": "ready", "initial_value": false, "initialization_priority": 1, "inverted": false, "pin_number": "56" } ], "variables": [] } pytactl-3.2/pytactl/tac_configs/TAC_PSOC_31.pinout.json000066400000000000000000000165021526550266300227610ustar00rootroot00000000000000{ "$schema": "https://qualcomm.github.io/tac/schemas/pinout-1.0.json", "format": "tac-pinout", "schema_version": "1.0", "source": { "repository": "https://github.com/qualcomm/qcom-test-automation-controller.git", "commit": "757cc972c88e4a1098881b2bc73f3d53eac286be", "path": "configurations", "file": "TAC_PSOC_31.tcnf" }, "description": "CCARD525 PSoC", "name": "CCARD525", "platform_id": 31, "platform_type": "PSOC", "reset_enabled": true, "script": "def powerOffTheDevice() \n\tlogComment ====== powerOffTheDevice sequence start ======\n\n\t12vpoweroff 1\n\tNADusb 1\n\tEAPusb 1\n\n\tlogComment ====== powerOffTheDevice sequence finish ======\n\ndef powerOnTheDevice()\n\tlogComment ====== powerOnTheDevice sequence start ======\n\n\tdelay 500\n\t12vpoweroff 0\n\tdelay 900\n\tNADusb 0\n\tEAPusb 0\n\tdelay 30\n\n\tlogComment ====== powerOnTheDevice sequence finish ======\n\ndef powerOff()\n\tlogComment ====== powerOff start ======\n\n\tpowerOffTheDevice\n\n\tpkey 0\n\tvolup 0\n\tvoldn 0\n\n\tNADedl 0\n\n\tlogComment ====== powerOff finish ======\n\ndef powerOn()\n\tlogComment ====== powerOn start ======\n\n\tpowerOff\n\n\tpowerOnTheDevice\n\n\tpkey 1\n\tdelay 800\n\tpkey 0\n\n\tlogComment ====== powerOn finish ======\n\ndef bootToNADEDL()\n\tlogComment ====== bootToEDL start ======\n\n\tpowerOffTheDevice\n\n\tpkey 0\n\tvolup 0\n\tvoldn 0\n\n\tNADedl 1\n\n\tpowerOnTheDevice\n\n\tpkey 1\n\tdelay 1300\n\tpkey 0\n\n\tNADedl 0\n\n\tlogComment ====== bootToEDL finish ======\n\ndef bootToEAPEDL()\n\tlogComment ====== bootToSecondaryEDL start ======\n\n\tpowerOffTheDevice\n\n\tpkey 0\n\tvolup 0\n\tvoldn 0\n\n\tEAPedl 1\n\n\tpowerOnTheDevice\n\n\tpkey 1\n\tdelay 800\n\tpkey 0\n\n\tdelay 1300\n\n\tEAPedl 0\n\n\tlogComment ====== bootToSecondaryEDL finish ======\n\ndef bootToUEFI()\n\tlogComment ====== bootToUEFIMenu start ======\n\n\tpowerOffTheDevice\n\n\t// Put buttons in a set state\n\tpkey 0\n\tvolup 1\n\tvoldn 0\n\n\tNADedl 0\n\n\tpowerOnTheDevice\n\n\tpkey 1\n\tdelay 8000\n\tpkey 0\n\tvolup 0\n\tdelay 12\n\tpkey 1\n\tvolup 1\n\n\tpkey 0\n\tvolup 0\n\n\tlogComment ====== bootToUEFIMenu finish ======\n\ndef bootToFastboot()\n\tlogComment ====== bootToFastboot start ======\n\n\tpowerOffTheDevice\n\n\tpkey 0\n\tvolup 0\n\tvoldn 1\n\n\tNADedl 0\n\n\tpowerOnTheDevice\n\n\tpkey 1\n\tdelay 800\n\tpkey 0\n\n\tdelay 8000\n\tvoldn 0\n\tdelay 30\n\tvoldn 1\n\n\tvoldn 0\n\n\tlogComment ====== bootToFastboot finished ======\n", "supportedFirmwareVer": [ 15 ], "usb_descriptor": "", "pins": [ { "classic_action": "TAC_SOFT_RESET", "command": "sftrst", "initial_value": false, "initialization_priority": -1, "inverted": false, "pin_number": "15" }, { "classic_action": "TC_EUD_EARLY_BOOT_EN", "command": "eud", "initial_value": false, "initialization_priority": -1, "inverted": false, "pin_number": "16" }, { "classic_action": "TAC_UIM1_DIS", "command": "uim1", "initial_value": false, "initialization_priority": -1, "inverted": false, "pin_number": "18" }, { "classic_action": "TAC_UIM2_DIS", "command": "uim2", "initial_value": false, "initialization_priority": -1, "inverted": false, "pin_number": "19" }, { "classic_action": "TAC_HEADSET_DIS", "command": "", "initial_value": false, "initialization_priority": -1, "inverted": false, "pin_number": "21" }, { "classic_action": "", "command": "", "initial_value": false, "initialization_priority": -1, "inverted": false, "pin_number": "29" }, { "classic_action": "TAC_FORCE_USB_BOOT_SEC", "command": "EAPedl", "initial_value": false, "initialization_priority": -1, "inverted": false, "pin_number": "30" }, { "classic_action": "TAC_RESET_SEC", "command": "EAPres", "initial_value": false, "initialization_priority": -1, "inverted": false, "pin_number": "31" }, { "classic_action": "TAC_VOL_UP", "command": "volup", "initial_value": false, "initialization_priority": -1, "inverted": false, "pin_number": "34" }, { "classic_action": "TAC_USB1_DIS", "command": "EAPusb", "initial_value": false, "initialization_priority": -1, "inverted": false, "pin_number": "36" }, { "classic_action": "TAC_FORCE_PS_HOLD", "command": "pshold", "initial_value": false, "initialization_priority": -1, "inverted": false, "pin_number": "37" }, { "classic_action": "", "command": "", "initial_value": false, "initialization_priority": -1, "inverted": false, "pin_number": "38" }, { "classic_action": "", "command": "", "initial_value": false, "initialization_priority": -1, "inverted": false, "pin_number": "39" }, { "classic_action": "", "command": "", "initial_value": false, "initialization_priority": -1, "inverted": false, "pin_number": "46" }, { "classic_action": "TAC_SDCARD_DISC", "command": "sdcard", "initial_value": false, "initialization_priority": -1, "inverted": false, "pin_number": "47" }, { "classic_action": "TAC_TC_START", "command": "pkey", "initial_value": false, "initialization_priority": -1, "inverted": false, "pin_number": "50" }, { "classic_action": "TAC_RESET_PRI", "command": "voldn", "initial_value": false, "initialization_priority": -1, "inverted": false, "pin_number": "51" }, { "classic_action": "TAC_POWER_OFF", "command": "12vpoweroff", "initial_value": false, "initialization_priority": -1, "inverted": false, "pin_number": "53" }, { "classic_action": "TAC_SW_DWNLD_PRI", "command": "NADedl", "initial_value": false, "initialization_priority": -1, "inverted": false, "pin_number": "54" }, { "classic_action": "TAC_USB0_DIS", "command": "NADusb", "initial_value": false, "initialization_priority": -1, "inverted": false, "pin_number": "55" } ], "variables": [] } pytactl-3.2/pytactl/tac_configs/TAC_PSOC_35.pinout.json000066400000000000000000000167101526550266300227660ustar00rootroot00000000000000{ "$schema": "https://qualcomm.github.io/tac/schemas/pinout-1.0.json", "format": "tac-pinout", "schema_version": "1.0", "source": { "repository": "https://github.com/qualcomm/qcom-test-automation-controller.git", "commit": "757cc972c88e4a1098881b2bc73f3d53eac286be", "path": "configurations", "file": "TAC_PSOC_35.tcnf" }, "description": "RB5 ", "name": "RB5", "platform_id": 35, "platform_type": "PSOC", "reset_enabled": true, "script": "def powerOffTheDevice() \n\tlogComment ====== powerOffTheDevice sequence start ======\n\n\tbattery 1\n\tusb0 1\n\tusb1 1\n\n\tlogComment ====== powerOffTheDevice sequence finish ======\n\ndef powerOnTheDevice()\n\tlogComment ====== powerOnTheDevice sequence start ======\n\n\tdelay 500\n\tbattery 0\n\tdelay 900\n\tusb0 0\n\tusb1 0\n\tdelay 30\n\n\tlogComment ====== powerOnTheDevice sequence finish ======\n\ndef powerOff()\n\tlogComment ====== powerOff start ======\n\n\tpowerOffTheDevice\n\n\tpkey 0\n\tvolup 0\n\tvoldn 0\n\n\tpedl 0\n\n\tlogComment ====== powerOff finish ======\n\ndef powerOn()\n\tlogComment ====== powerOn start ======\n\t\n\tpowerOnTheDevice\n\t\n\tdelay 30\n\n\tpkey 1\n\tdelay $powerDelay\n\tpkey 0\n\tlogComment ====== powerOn finish ======\n\n\ndef bootToEDL()\n\tlogComment ====== bootToEDL start ======\n\n\t\n\tpkey 0\n\tvolup 0\n\tvoldn 0\n\n\tpedl 1\n\n\tpkey 1\n\tdelay $edl\n\tpkey 0\n\n\tpedl 0\n\n\tlogComment ====== bootToEDL finish ======\n\ndef bootToSecondaryEDL()\n\tlogComment ====== bootToSecondaryEDL start ======\n\n\tpowerOffTheDevice\n\n\tpkey 0\n\tvolup 0\n\tvoldn 0\n\n\tsedl 1\n\n\tpowerOnTheDevice\n\n\tpkey 1\n\tdelay 800\n\tpkey 0\n\n\tdelay 1300\n\n\tsedl 0\n\n\tlogComment ====== bootToSecondaryEDL finish ======\n\ndef bootToUEFI()\n\tlogComment ====== bootToUEFIMenu start ======\n\n\tpowerOffTheDevice\n\n\t// Put buttons in a set state\n\tpkey 0\n\tvolup 1\n\tvoldn 0\n\n\tpedl 0\n\n\tpowerOnTheDevice\n\n\tpkey 1\n\tdelay 8000\n\tpkey 0\n\tvolup 0\n\tdelay 12\n\tpkey 1\n\tvolup 1\n\n\tpkey 0\n\tvolup 0\n\n\tlogComment ====== bootToUEFIMenu finish ======\n\ndef bootToFastboot()\n\tlogComment ====== bootToFastboot start ======\n\n\tpowerOnTheDevice\n\n\tpkey 1\n\tdelay 800\n\tvoldn 1\n\n\tdelay $fastboot1\n\n\tpkey 0\n\n\tdelay $fastboot2\n\n\tvoldn 0\n\t\n\tlogComment ====== bootToFastboot finished ======\n", "supportedFirmwareVer": [ 15 ], "usb_descriptor": "", "pins": [ { "classic_action": "TAC_SOFT_RESET", "command": "", "initial_value": false, "initialization_priority": -1, "inverted": false, "pin_number": "15" }, { "classic_action": "TC_EUD_EARLY_BOOT_EN", "command": "eud", "initial_value": false, "initialization_priority": -1, "inverted": false, "pin_number": "16" }, { "classic_action": "TAC_UIM1_DIS", "command": "uim1", "initial_value": false, "initialization_priority": -1, "inverted": false, "pin_number": "18" }, { "classic_action": "TAC_UIM2_DIS", "command": "uim2", "initial_value": false, "initialization_priority": -1, "inverted": false, "pin_number": "19" }, { "classic_action": "TAC_HEADSET_DIS", "command": "headset", "initial_value": false, "initialization_priority": -1, "inverted": false, "pin_number": "21" }, { "classic_action": "", "command": "", "initial_value": false, "initialization_priority": -1, "inverted": false, "pin_number": "29" }, { "classic_action": "TAC_FORCE_USB_BOOT_SEC", "command": "sedl", "initial_value": false, "initialization_priority": -1, "inverted": false, "pin_number": "30" }, { "classic_action": "TAC_RESET_SEC", "command": "sresn", "initial_value": false, "initialization_priority": -1, "inverted": false, "pin_number": "31" }, { "classic_action": "TAC_VOL_UP", "command": "volup", "initial_value": false, "initialization_priority": -1, "inverted": false, "pin_number": "34" }, { "classic_action": "TAC_USB1_DIS", "command": "usb1", "initial_value": false, "initialization_priority": 2, "inverted": true, "pin_number": "36" }, { "classic_action": "TAC_FORCE_PS_HOLD", "command": "pshold", "initial_value": false, "initialization_priority": -1, "inverted": false, "pin_number": "37" }, { "classic_action": "", "command": "", "initial_value": false, "initialization_priority": -1, "inverted": false, "pin_number": "38" }, { "classic_action": "", "command": "", "initial_value": false, "initialization_priority": -1, "inverted": false, "pin_number": "39" }, { "classic_action": "", "command": "", "initial_value": false, "initialization_priority": -1, "inverted": false, "pin_number": "46" }, { "classic_action": "TAC_SDCARD_DISC", "command": "sdcard", "initial_value": false, "initialization_priority": -1, "inverted": false, "pin_number": "47" }, { "classic_action": "TAC_TC_START", "command": "pkey", "initial_value": false, "initialization_priority": -1, "inverted": false, "pin_number": "50" }, { "classic_action": "TAC_RESET_PRI", "command": "voldn", "initial_value": false, "initialization_priority": -1, "inverted": false, "pin_number": "51" }, { "classic_action": "TAC_POWER_OFF", "command": "battery", "initial_value": false, "initialization_priority": 2, "inverted": true, "pin_number": "53" }, { "classic_action": "TAC_SW_DWNLD_PRI", "command": "pedl", "initial_value": false, "initialization_priority": -1, "inverted": false, "pin_number": "54" }, { "classic_action": "TAC_USB0_DIS", "command": "usb0", "initial_value": false, "initialization_priority": 2, "inverted": true, "pin_number": "55" } ], "variables": [ { "default_value": "20000", "name": "edl" }, { "default_value": "10000", "name": "fastboot1" }, { "default_value": "10000", "name": "fastboot2" }, { "default_value": "2000", "name": "powerDelay" } ] } pytactl-3.2/pytactl/tac_configs/TAC_PSOC_44.pinout.json000066400000000000000000000152111526550266300227610ustar00rootroot00000000000000{ "$schema": "https://qualcomm.github.io/tac/schemas/pinout-1.0.json", "format": "tac-pinout", "schema_version": "1.0", "source": { "repository": "https://github.com/qualcomm/qcom-test-automation-controller.git", "commit": "757cc972c88e4a1098881b2bc73f3d53eac286be", "path": "configurations", "file": "TAC_PSOC_44.tcnf" }, "description": "Kanapali QRD", "name": "Kanapali QRD", "platform_id": 44, "platform_type": "PSOC", "reset_enabled": true, "script": "def powerOffTheDevice() \r\n\tlogComment ====== powerOffTheDevice sequence start ======\r\n\r\n\tbattery 1\r\n\tusb0 1\r\n\tusb1 1\r\n\r\n\tlogComment ====== powerOffTheDevice sequence finish ======\r\n\r\ndef powerOnTheDevice()\r\n\tlogComment ====== powerOnTheDevice sequence start ======\r\n\r\n\tdelay 500\r\n\tbattery 0\r\n\tdelay 900\r\n\tusb0 0\r\n\tusb1 0\r\n\tdelay 30\r\n\r\n\tlogComment ====== powerOnTheDevice sequence finish ======\r\n\r\ndef powerOff()\r\n\tlogComment ====== powerOff start ======\r\n\r\n\tpowerOffTheDevice\r\n\r\n\tpkey 0\r\n\tvolup 0\r\n\tvoldn 0\r\n\r\n\tpedl 0\r\n\r\n\tlogComment ====== powerOff finish ======\r\n\r\ndef powerOn()\r\n\tlogComment ====== powerOn start ======\r\n\r\n\tpowerOff\r\n\r\n\tpowerOnTheDevice\r\n\r\n\tpkey 1\r\n\tdelay 800\r\n\tpkey 0\r\n\r\n\tlogComment ====== powerOn finish ======\r\n\r\ndef bootToEDL()\r\n\tlogComment ====== bootToEDL start ======\r\n\r\n\tpowerOffTheDevice\r\n\r\n\tpkey 0\r\n\tvolup 0\r\n\tvoldn 0\r\n\r\n\tpedl 1\r\n\r\n\tpowerOnTheDevice\r\n\r\n\tpkey 1\r\n\tdelay $edl\r\n\tpkey 0\r\n\r\n\tpedl 0\r\n\r\n\tlogComment ====== bootToEDL finish ======\r\n\r\ndef bootToSecondaryEDL()\r\n\tlogComment ====== bootToSecondaryEDL start ======\r\n\r\n\tpowerOffTheDevice\r\n\r\n\tpkey 0\r\n\tvolup 0\r\n\tvoldn 0\r\n\r\n\tsedl 1\r\n\r\n\tpowerOnTheDevice\r\n\r\n\tpkey 1\r\n\tdelay 800\r\n\tpkey 0\r\n\r\n\tdelay 1300\r\n\r\n\tsedl 0\r\n\r\n\tlogComment ====== bootToSecondaryEDL finish ======\r\n\r\ndef bootToUEFI()\r\n\tlogComment ====== bootToUEFIMenu start ======\r\n\r\n\tpowerOffTheDevice\r\n\r\n\t// Put buttons in a set state\r\n\tpkey 0\r\n\tvolup 1\r\n\tvoldn 0\r\n\r\n\tpedl 0\r\n\r\n\tpowerOnTheDevice\r\n\r\n\tpkey 1\r\n\tdelay $uefi\r\n\tpkey 0\r\n\tvolup 0\r\n\tdelay 12\r\n\tpkey 1\r\n\tvolup 1\r\n\r\n\tpkey 0\r\n\tvolup 0\r\n\r\n\tlogComment ====== bootToUEFIMenu finish ======\r\n\r\ndef bootToFastboot()\r\n\tlogComment ====== bootToFastboot start ======\r\n\r\n\tpowerOffTheDevice\r\n\r\n\tpkey 0\r\n\tvolup 0\r\n\tvoldn 1\r\n\r\n\tpedl 0\r\n\r\n\tpowerOnTheDevice\r\n\r\n\tpkey 1\r\n\tdelay 800\r\n\tpkey 0\r\n\r\n\tdelay $fastboot\r\n\tvoldn 0\r\n\tdelay 30\r\n\tvoldn 1\r\n\r\n\tvoldn 0\r\n\r\n\tlogComment ====== bootToFastboot finished ======\r\n", "supportedFirmwareVer": [ 15 ], "usb_descriptor": "", "pins": [ { "classic_action": "TC_EUD_EARLY_BOOT_EN", "command": "eud", "initial_value": false, "initialization_priority": -1, "inverted": false, "pin_number": "16" }, { "classic_action": "TAC_UIM1_DIS", "command": "uim1", "initial_value": false, "initialization_priority": -1, "inverted": false, "pin_number": "18" }, { "classic_action": "TAC_UIM2_DIS", "command": "uim2", "initial_value": false, "initialization_priority": -1, "inverted": false, "pin_number": "19" }, { "classic_action": "TAC_HEADSET_DIS", "command": "headset", "initial_value": false, "initialization_priority": -1, "inverted": false, "pin_number": "21" }, { "classic_action": "TAC_FORCE_USB_BOOT_SEC", "command": "sedl", "initial_value": false, "initialization_priority": -1, "inverted": false, "pin_number": "30" }, { "classic_action": "TAC_RESET_SEC", "command": "sresn", "initial_value": false, "initialization_priority": -1, "inverted": false, "pin_number": "31" }, { "classic_action": "TAC_VOL_UP", "command": "volup", "initial_value": false, "initialization_priority": -1, "inverted": false, "pin_number": "34" }, { "classic_action": "TAC_USB1_DIS", "command": "usb1", "initial_value": false, "initialization_priority": 2, "inverted": true, "pin_number": "36" }, { "classic_action": "TAC_FORCE_PS_HOLD", "command": "pshold", "initial_value": false, "initialization_priority": -1, "inverted": false, "pin_number": "37" }, { "classic_action": "TAC_SDCARD_DISC", "command": "sdcard", "initial_value": false, "initialization_priority": -1, "inverted": false, "pin_number": "47" }, { "classic_action": "TAC_TC_START", "command": "pkey", "initial_value": false, "initialization_priority": -1, "inverted": false, "pin_number": "50" }, { "classic_action": "TAC_RESET_PRI", "command": "voldn", "initial_value": false, "initialization_priority": -1, "inverted": false, "pin_number": "51" }, { "classic_action": "TAC_POWER_OFF", "command": "battery", "initial_value": false, "initialization_priority": 2, "inverted": true, "pin_number": "53" }, { "classic_action": "TAC_SW_DWNLD_PRI", "command": "pedl", "initial_value": false, "initialization_priority": -1, "inverted": false, "pin_number": "54" }, { "classic_action": "TAC_USB0_DIS", "command": "usb0", "initial_value": false, "initialization_priority": 2, "inverted": true, "pin_number": "55" } ], "variables": [ { "default_value": "1300", "name": "edl" }, { "default_value": "8000", "name": "fastboot" }, { "default_value": "8000", "name": "uefi" } ] } pytactl-3.2/pytactl/tac_configs/TAC_PSOC_57.pinout.json000066400000000000000000000163031526550266300227700ustar00rootroot00000000000000{ "$schema": "https://qualcomm.github.io/tac/schemas/pinout-1.0.json", "format": "tac-pinout", "schema_version": "1.0", "source": { "repository": "https://github.com/qualcomm/qcom-test-automation-controller.git", "commit": "757cc972c88e4a1098881b2bc73f3d53eac286be", "path": "configurations", "file": "TAC_PSOC_57.tcnf" }, "description": "Monaco/Lemans ADP Automotive", "supportedFirmwareVer": [ 16 ], "name": "Monaco/Lemans RIDE MCU Less ADP Automotive", "platform_id": 57, "platform_type": "PSOC", "reset_enabled": false, "script": "def powerOff() \n\tlogComment ====== powerOffTheDevice sequence start ======\n\n\tbattery 1\n\n\tlogComment ====== powerOffTheDevice sequence finish ======\n\n\ndef powerOn()\n\tlogComment ====== powerOnTheDevice sequence start ======\n\n\tbattery 0\n\n\tlogComment ====== powerOnTheDevice sequence finish ======\n\n\ndef reset()\n\tlogComment ====== reset start ======\n\n\tpowerOff\n\tdelay 1500\n\tpowerOn\n\n\tlogComment ====== reset finish ======\n\n\ndef bootToEDL()\n\tlogComment ====== s1_md_sail_edl start ======\n\n\tpowerOff\n\tpedl 1\n\tsdcard 1\n\tdelay 1500\n\tpowerOn\n\tdelay 5000\n\tdelay $Optional_GPIO_Hold_Time\n\tpedl 0\n\tsdcard 0\n\n\tlogComment ====== s1_md_sail_edl finish ======\n\n\ndef bootToUEFI()\n\tlogComment ====== s1_uefi start ======\n\n\treset\n\tvolup 1\n\tdelay 1000\n\tpkey 1\n\tvoldn 0\n\tpedl 0\n\tdelay 8000\n\tdelay $Optional_GPIO_Hold_Time\n\tpkey 0\n\tvolup 0\n\tdelay 12\n\tpkey 1\n\tvolup 1\n\tpkey 0\n\tvolup 0 \n\n\tlogComment ======s1_uefi finish ======\n\n\ndef bootToFastboot()\n\tlogComment ====== s1_fastboot start ======\n\n\tpowerOff\n\tdelay 20\n\tfastboot 0\n\tpowerOn\n\tdelay 2000\n\tfastboot 1\n\n\tlogComment ====== s1_fastboot finish ======\n\n\n\ndef WAKEIN()\n\tlogComment ====== s1_WAKEIN start ======\n\n\t\n\twakein 1\n\tdelay 50\n\twakein 0\n\n\tlogComment ====== s1_WAKEIN finish ======\n\n\ndef mculesspoff()\n\tlogComment ====== s1_mculesspoff start ======\n\n\t\n\tfastpoff 1\n\tdelay 50\n\tfastpoff 0\n\n\tlogComment ====== s1_mculesspoff finish ======\n", "usb_descriptor": "", "pins": [ { "classic_action": "TAC_SOFT_RESET", "command": "eud", "initial_value": false, "initialization_priority": -1, "inverted": false, "pin_number": "15" }, { "classic_action": "TC_EUD_EARLY_BOOT_EN", "command": "", "initial_value": false, "initialization_priority": -1, "inverted": false, "pin_number": "16" }, { "classic_action": "TAC_UIM1_DIS", "command": "uim1", "initial_value": false, "initialization_priority": -1, "inverted": false, "pin_number": "18" }, { "classic_action": "TAC_UIM2_DIS", "command": "uim2", "initial_value": false, "initialization_priority": -1, "inverted": false, "pin_number": "19" }, { "classic_action": "TAC_HEADSET_DIS", "command": "headset", "initial_value": false, "initialization_priority": -1, "inverted": false, "pin_number": "21" }, { "classic_action": "", "command": "fastpoff", "initial_value": false, "initialization_priority": -1, "inverted": false, "pin_number": "29" }, { "classic_action": "TAC_FORCE_USB_BOOT_SEC", "command": "sedl", "initial_value": false, "initialization_priority": -1, "inverted": false, "pin_number": "30" }, { "classic_action": "TAC_RESET_SEC", "command": "sdcard", "initial_value": false, "initialization_priority": -1, "inverted": false, "pin_number": "31" }, { "classic_action": "TAC_VOL_UP", "command": "volup", "initial_value": false, "initialization_priority": -1, "inverted": false, "pin_number": "34" }, { "classic_action": "TAC_USB1_DIS", "command": "usb1", "initial_value": false, "initialization_priority": 2, "inverted": true, "pin_number": "36" }, { "classic_action": "TAC_FORCE_PS_HOLD", "command": "", "initial_value": false, "initialization_priority": -1, "inverted": false, "pin_number": "37" }, { "classic_action": "", "command": "pshold", "initial_value": false, "initialization_priority": -1, "inverted": false, "pin_number": "38" }, { "classic_action": "", "command": "sresn", "initial_value": false, "initialization_priority": -1, "inverted": false, "pin_number": "39" }, { "classic_action": "", "command": "", "initial_value": false, "initialization_priority": -1, "inverted": false, "pin_number": "46" }, { "classic_action": "", "command": "wakein", "initial_value": false, "initialization_priority": -1, "inverted": false, "pin_number": "48" }, { "classic_action": "", "command": "fastboot", "initial_value": true, "initialization_priority": -1, "inverted": false, "pin_number": "49" }, { "classic_action": "TAC_TC_START", "command": "pkey", "initial_value": false, "initialization_priority": -1, "inverted": false, "pin_number": "50" }, { "classic_action": "TAC_RESET_PRI", "command": "voldn", "initial_value": false, "initialization_priority": -1, "inverted": false, "pin_number": "51" }, { "classic_action": "TAC_POWER_OFF", "command": "battery", "initial_value": false, "initialization_priority": 2, "inverted": true, "pin_number": "53" }, { "classic_action": "TAC_SW_DWNLD_PRI", "command": "pedl", "initial_value": false, "initialization_priority": -1, "inverted": false, "pin_number": "54" }, { "classic_action": "TAC_USB0_DIS", "command": "usb0", "initial_value": false, "initialization_priority": 2, "inverted": true, "pin_number": "55" } ], "variables": [ { "default_value": "0", "name": "Optional_GPIO_Hold_Time" } ] } pytactl-3.2/pytactl/tac_configs/TAC_PSOC_66.pinout.json000066400000000000000000000205341526550266300227710ustar00rootroot00000000000000{ "$schema": "https://qualcomm.github.io/tac/schemas/pinout-1.0.json", "format": "tac-pinout", "schema_version": "1.0", "source": { "repository": "https://github.com/qualcomm/qcom-test-automation-controller.git", "commit": "757cc972c88e4a1098881b2bc73f3d53eac286be", "path": "configurations", "file": "TAC_PSOC_66.tcnf" }, "description": "Hawi MTP8975 - PSoC", "name": "Hawi MTP8975", "platform_id": 66, "platform_type": "PSOC", "reset_enabled": false, "script": "def powerOffTheDevice() \n\tlogComment ====== powerOffTheDevice sequence start ======\n\n\tbattery 1\n\tusb0 1\n\n\tlogComment ====== powerOffTheDevice sequence finish ======\n\ndef powerOnTheDevice()\n\tlogComment ====== powerOnTheDevice sequence start ======\n\n\tdelay 500\n\tbattery 0\n\tdelay 900\n\tusb0 0\n\tdelay 30\n\n\tlogComment ====== powerOnTheDevice sequence finish ======\n\ndef powerOff()\n\tlogComment ====== powerOff start ======\n\n\tpowerOffTheDevice\n\n\tpkey 0\n\tvolup 0\n\tvoldn 0\n\n\tpedl 0\n\n\tlogComment ====== powerOff finish ======\n\ndef powerOn()\n\tlogComment ====== powerOn start ======\n\n\tpowerOff\n\n\tpowerOnTheDevice\n\n\tpkey 1\n\tdelay 800\n\tpkey 0\n\n\tlogComment ====== powerOn finish ======\n\ndef bootToEDL()\n\tlogComment ====== bootToEDL start ======\n\n\tpowerOffTheDevice\n\n\tpkey 0\n\tvolup 0\n\tvoldn 0\n\n\tpedl 1\n\n\tpowerOnTheDevice\n\n\tpkey 1\n\tdelay $edl\n\tpkey 0\n\n\tpedl 0\n\n\tlogComment ====== bootToEDL finish ======\n\ndef bootToSecondaryEDL()\n\tlogComment ====== bootToSecondaryEDL start ======\n\n\tpowerOffTheDevice\n\n\tpkey 0\n\tvolup 0\n\tvoldn 0\n\n\tsedl 1\n\n\tpowerOnTheDevice\n\n\tpkey 1\n\tdelay 800\n\tpkey 0\n\n\tdelay 1300\n\n\tsedl 0\n\n\tlogComment ====== bootToSecondaryEDL finish ======\n\ndef bootToBatteryEDL()\n\tlogComment ====== bootToBatteryEDL start ======\n\t\n\tpedl 1 //set EDL high\n\tvoldn 1 //reset MTP after 115 seconds\n\tdelay 14000\n\n\tpkey 1\n\tdelay 1300\n\tpkey 0\n\t\n\t//reset buttons\n\tdelay 6000\n\tvoldn 0 \n\tpedl 0\n\n\tlogComment ====== bootToBatteryEDL finish ======\n\ndef bootToUEFI()\n\tlogComment ====== bootToUEFIMenu start ======\n\n\tpowerOffTheDevice\n\n\t// Put buttons in a set state\n\tpkey 0\n\tvolup 1\n\tvoldn 0\n\n\tpedl 0\n\n\tpowerOnTheDevice\n\n\tpkey 1\n\tdelay $uefi\n\tpkey 0\n\tvolup 0\n\tdelay 12\n\tpkey 1\n\tvolup 1\n\n\tpkey 0\n\tvolup 0\n\n\tlogComment ====== bootToUEFIMenu finish ======\n\ndef bootToFastboot()\n\tlogComment ====== bootToFastboot start ======\n\n\tpowerOffTheDevice\n\n\tpkey 0\n\tvolup 0\n\tvoldn 1\n\n\tpedl 0\n\n\tpowerOnTheDevice\n\n\tpkey 1\n\tdelay 800\n\tpkey 0\n\n\tdelay $fastboot\n\tvoldn 0\n\tdelay 30\n\tvoldn 1\n\n\tvoldn 0\n\n\tlogComment ====== bootToFastboot finished ======\n\ndef batteryReset()\n\tlogComment ====== batteryReset ======\n\t\n\tpedl 0 //reset EDL\n\tvoldn 1 //reset MTP after 14 seconds\n\tdelay 14000\n\n\tpkey 1\n\tdelay 1300\n\tpkey 0\n\n\tdelay 6000\n\tvoldn 0 //release voldn to stop MTP reset\n\n\tlogComment ====== batteryReset ======", "supportedFirmwareVer": [ 17 ], "usb_descriptor": "", "pins": [ { "classic_action": "TAC_SOFT_RESET", "command": "", "initial_value": false, "initialization_priority": -1, "inverted": false, "pin_number": "15" }, { "classic_action": "TC_EUD_EARLY_BOOT_EN", "command": "eud", "initial_value": false, "initialization_priority": -1, "inverted": false, "pin_number": "16" }, { "classic_action": "TAC_UIM1_DIS", "command": "uim1", "initial_value": false, "initialization_priority": -1, "inverted": false, "pin_number": "18" }, { "classic_action": "TAC_UIM2_DIS", "command": "uim2", "initial_value": false, "initialization_priority": -1, "inverted": false, "pin_number": "19" }, { "classic_action": "TAC_HEADSET_DIS", "command": "", "initial_value": false, "initialization_priority": -1, "inverted": false, "pin_number": "21" }, { "classic_action": "", "command": "", "initial_value": false, "initialization_priority": -1, "inverted": false, "pin_number": "29" }, { "classic_action": "TAC_FORCE_USB_BOOT_SEC", "command": "", "initial_value": false, "initialization_priority": -1, "inverted": false, "pin_number": "30" }, { "classic_action": "TAC_RESET_SEC", "command": "", "initial_value": false, "initialization_priority": -1, "inverted": false, "pin_number": "31" }, { "classic_action": "TAC_VOL_UP", "command": "volup", "initial_value": false, "initialization_priority": -1, "inverted": false, "pin_number": "34" }, { "classic_action": "TAC_USB1_DIS", "command": "", "initial_value": false, "initialization_priority": -1, "inverted": false, "pin_number": "36" }, { "classic_action": "TAC_FORCE_PS_HOLD", "command": "pshold", "initial_value": false, "initialization_priority": -1, "inverted": false, "pin_number": "37" }, { "classic_action": "", "command": "", "initial_value": false, "initialization_priority": -1, "inverted": false, "pin_number": "38" }, { "classic_action": "", "command": "rcmsel", "initial_value": false, "initialization_priority": -1, "inverted": false, "pin_number": "46" }, { "classic_action": "TAC_SDCARD_DISC", "command": "sdcard", "initial_value": false, "initialization_priority": -1, "inverted": false, "pin_number": "47" }, { "classic_action": "", "command": "headset", "initial_value": false, "initialization_priority": -1, "inverted": false, "pin_number": "48" }, { "classic_action": "", "command": "msmreset", "initial_value": false, "initialization_priority": -1, "inverted": false, "pin_number": "49" }, { "classic_action": "TAC_TC_START", "command": "pkey", "initial_value": false, "initialization_priority": -1, "inverted": false, "pin_number": "50" }, { "classic_action": "TAC_RESET_PRI", "command": "voldn", "initial_value": false, "initialization_priority": -1, "inverted": false, "pin_number": "51" }, { "classic_action": "TAC_POWER_OFF", "command": "battery", "initial_value": false, "initialization_priority": 2, "inverted": true, "pin_number": "53" }, { "classic_action": "TAC_SW_DWNLD_PRI", "command": "pedl", "initial_value": false, "initialization_priority": -1, "inverted": false, "pin_number": "54" }, { "classic_action": "TAC_USB0_DIS", "command": "usb0", "initial_value": false, "initialization_priority": 2, "inverted": true, "pin_number": "55" } ], "variables": [ { "default_value": "1300", "name": "edl" }, { "default_value": "8000", "name": "fastboot" }, { "default_value": "8000", "name": "uefi" } ] } pytactl-3.2/pytactl/tac_configs/TAC_PSOC_7.pinout.json000066400000000000000000000164251526550266300227100ustar00rootroot00000000000000{ "$schema": "https://qualcomm.github.io/tac/schemas/pinout-1.0.json", "format": "tac-pinout", "schema_version": "1.0", "source": { "repository": "https://github.com/qualcomm/qcom-test-automation-controller.git", "commit": "757cc972c88e4a1098881b2bc73f3d53eac286be", "path": "configurations", "file": "TAC_PSOC_7.tcnf" }, "description": "Alpaca V3.1", "name": "Alpaca V3.1", "platform_id": 7, "platform_type": "PSOC", "reset_enabled": true, "script": "def powerOffTheDevice() \n\tlogComment ====== powerOffTheDevice sequence start ======\n\n\tbattery 1\n\tusb0 1\n\tusb1 1\n\n\tlogComment ====== powerOffTheDevice sequence finish ======\n\ndef powerOnTheDevice()\n\tlogComment ====== powerOnTheDevice sequence start ======\n\n\tdelay 500\n\tbattery 0\n\tdelay 900\n\tusb0 0\n\tusb1 0\n\tdelay 30\n\n\tlogComment ====== powerOnTheDevice sequence finish ======\n\ndef powerOff()\n\tlogComment ====== powerOff start ======\n\n\tpowerOffTheDevice\n\n\tpkey 0\n\tvolup 0\n\tvoldn 0\n\n\tpedl 0\n\n\tlogComment ====== powerOff finish ======\n\ndef powerOn()\n\tlogComment ====== powerOn start ======\n\n\tpowerOff\n\n\tpowerOnTheDevice\n\n\tpkey 1\n\tdelay 800\n\tpkey 0\n\n\tlogComment ====== powerOn finish ======\n\ndef bootToEDL()\n\tlogComment ====== bootToEDL start ======\n\n\tpowerOffTheDevice\n\n\tpkey 0\n\tvolup 0\n\tvoldn 0\n\n\tpedl 1\n\n\tpowerOnTheDevice\n\n\tpkey 1\n\tdelay 1300\n\tpkey 0\n\n\tpedl 0\n\n\tlogComment ====== bootToEDL finish ======\n\ndef bootToSecondaryEDL()\n\tlogComment ====== bootToSecondaryEDL start ======\n\n\tpowerOffTheDevice\n\n\tpkey 0\n\tvolup 0\n\tvoldn 0\n\n\tsedl 1\n\n\tpowerOnTheDevice\n\n\tpkey 1\n\tdelay 800\n\tpkey 0\n\n\tdelay 1300\n\n\tsedl 0\n\n\tlogComment ====== bootToSecondaryEDL finish ======\n\ndef bootToUEFI()\n\tlogComment ====== bootToUEFIMenu start ======\n\n\tpowerOffTheDevice\n\n\t// Put buttons in a set state\n\tpkey 0\n\tvolup 1\n\tvoldn 0\n\n\tpedl 0\n\n\tpowerOnTheDevice\n\n\tpkey 1\n\tdelay 8000\n\tpkey 0\n\tvolup 0\n\tdelay 12\n\tpkey 1\n\tvolup 1\n\n\tpkey 0\n\tvolup 0\n\n\tlogComment ====== bootToUEFIMenu finish ======\n\ndef bootToFastBoot()\n\tlogComment ====== bootToFastBoot start ======\n\n\tpowerOffTheDevice\n\n\tpkey 0\n\tvolup 0\n\tvoldn 1\n\n\tpedl 0\n\n\tpowerOnTheDevice\n\n\tpkey 1\n\tdelay 8000\n\tpkey 0\n\n\tdelay 8000\n\tvoldn 0\n\tdelay 30\n\tvoldn 1\n\n\tvoldn 0\n\n\tlogComment ====== bootToFastBoot finished ======\n", "supportedFirmwareVer": [ 15 ], "usb_descriptor": "", "pins": [ { "classic_action": "TAC_SOFT_RESET", "command": "", "initial_value": false, "initialization_priority": -1, "inverted": false, "pin_number": "15" }, { "classic_action": "TC_EUD_EARLY_BOOT_EN", "command": "eud", "initial_value": false, "initialization_priority": -1, "inverted": false, "pin_number": "16" }, { "classic_action": "TAC_UIM1_DIS", "command": "uim1", "initial_value": false, "initialization_priority": -1, "inverted": false, "pin_number": "18" }, { "classic_action": "TAC_UIM2_DIS", "command": "uim2", "initial_value": false, "initialization_priority": -1, "inverted": false, "pin_number": "19" }, { "classic_action": "TAC_HEADSET_DIS", "command": "headset", "initial_value": false, "initialization_priority": -1, "inverted": false, "pin_number": "21" }, { "classic_action": "", "command": "", "initial_value": false, "initialization_priority": -1, "inverted": false, "pin_number": "29" }, { "classic_action": "TAC_FORCE_USB_BOOT_SEC", "command": "sedl", "initial_value": false, "initialization_priority": -1, "inverted": false, "pin_number": "30" }, { "classic_action": "TAC_RESET_SEC", "command": "sresn", "initial_value": false, "initialization_priority": -1, "inverted": false, "pin_number": "31" }, { "classic_action": "TAC_VOL_UP", "command": "volup", "initial_value": false, "initialization_priority": -1, "inverted": false, "pin_number": "34" }, { "classic_action": "TAC_USB1_DIS", "command": "usb1", "initial_value": false, "initialization_priority": 2, "inverted": true, "pin_number": "36" }, { "classic_action": "TAC_FORCE_PS_HOLD", "command": "pshold", "initial_value": false, "initialization_priority": -1, "inverted": false, "pin_number": "37" }, { "classic_action": "", "command": "", "initial_value": false, "initialization_priority": -1, "inverted": false, "pin_number": "38" }, { "classic_action": "", "command": "", "initial_value": false, "initialization_priority": -1, "inverted": false, "pin_number": "39" }, { "classic_action": "", "command": "", "initial_value": false, "initialization_priority": -1, "inverted": false, "pin_number": "46" }, { "classic_action": "TAC_SDCARD_DISC", "command": "sdcard", "initial_value": false, "initialization_priority": -1, "inverted": false, "pin_number": "47" }, { "classic_action": "TAC_TC_START", "command": "pkey", "initial_value": false, "initialization_priority": -1, "inverted": false, "pin_number": "50" }, { "classic_action": "TAC_RESET_PRI", "command": "voldn", "initial_value": false, "initialization_priority": -1, "inverted": false, "pin_number": "51" }, { "classic_action": "TAC_POWER_OFF", "command": "battery", "initial_value": false, "initialization_priority": 2, "inverted": true, "pin_number": "53" }, { "classic_action": "TAC_SW_DWNLD_PRI", "command": "pedl", "initial_value": false, "initialization_priority": -1, "inverted": false, "pin_number": "54" }, { "classic_action": "TAC_USB0_DIS", "command": "usb0", "initial_value": false, "initialization_priority": 2, "inverted": true, "pin_number": "55" } ], "variables": [] } pytactl-3.2/pytactl/tac_configs/TAC_PSOC_74.pinout.json000066400000000000000000000173321526550266300227720ustar00rootroot00000000000000{ "$schema": "https://qualcomm.github.io/tac/schemas/pinout-1.0.json", "format": "tac-pinout", "schema_version": "1.0", "source": { "repository": "https://github.com/qualcomm/qcom-test-automation-controller.git", "commit": "757cc972c88e4a1098881b2bc73f3d53eac286be", "path": "configurations", "file": "TAC_PSOC_74.tcnf" }, "platform_id": 74, "name": "Aliso CDP", "platform_type": "PSOC", "description": "30-P9415-2 Dongle for Aliso", "usb_descriptor": "", "reset_enabled": false, "script": "def powerOffTheDevice() \r\n\tlogComment ====== powerOffTheDevice sequence start ======\r\n\r\n\tbattery 1\r\n\tusb0 1\r\n\tusb1 1\r\n\r\n\tlogComment ====== powerOffTheDevice sequence finish ======\r\n\r\ndef powerOnTheDevice()\r\n\tlogComment ====== powerOnTheDevice sequence start ======\r\n\r\n\tdelay 500\r\n\tbattery 0\r\n\tdelay 900\r\n\tusb0 0\r\n\tusb1 0\r\n\tdelay 30\r\n\r\n\tlogComment ====== powerOnTheDevice sequence finish ======\r\n\r\ndef powerOff()\r\n\tlogComment ====== powerOff start ======\r\n\r\n\tpowerOffTheDevice\r\n\r\n\tpkey 0\r\n\tvolup 0\r\n\tvoldn 0\r\n\r\n\tpedl 0\r\n\r\n\tlogComment ====== powerOff finish ======\r\n\r\ndef powerOn()\r\n\tlogComment ====== powerOn start ======\r\n\r\n\tpowerOff\r\n\r\n\tpowerOnTheDevice\r\n\r\n\tpkey 1\r\n\tdelay 800\r\n\tpkey 0\r\n\r\n\tlogComment ====== powerOn finish ======\r\n\r\ndef bootToEDL()\r\n\tlogComment ====== bootToEDL start ======\r\n\r\n\tpowerOffTheDevice\r\n\r\n\tpkey 0\r\n\tvolup 0\r\n\tvoldn 0\r\n\r\n\tpedl 1\r\n\r\n\tpowerOnTheDevice\r\n\r\n\tpkey 1\r\n\tdelay $edl\r\n\tpkey 0\r\n\r\n\tpedl 0\r\n\r\n\tlogComment ====== bootToEDL finish ======\r\n\r\ndef bootToSecondaryEDL()\r\n\tlogComment ====== bootToSecondaryEDL start ======\r\n\r\n\tpowerOffTheDevice\r\n\r\n\tpkey 0\r\n\tvolup 0\r\n\tvoldn 0\r\n\r\n\tsedl 1\r\n\r\n\tpowerOnTheDevice\r\n\r\n\tpkey 1\r\n\tdelay 800\r\n\tpkey 0\r\n\r\n\tdelay 1300\r\n\r\n\tsedl 0\r\n\r\n\tlogComment ====== bootToSecondaryEDL finish ======\r\n\r\ndef bootToUEFI()\r\n\tlogComment ====== bootToUEFIMenu start ======\r\n\r\n\tpowerOffTheDevice\r\n\r\n\t// Put buttons in a set state\r\n\tpkey 0\r\n\tvolup 1\r\n\tvoldn 0\r\n\r\n\tpedl 0\r\n\r\n\tpowerOnTheDevice\r\n\r\n\tpkey 1\r\n\tdelay $uefi\r\n\tpkey 0\r\n\tvolup 0\r\n\tdelay 12\r\n\tpkey 1\r\n\tvolup 1\r\n\r\n\tpkey 0\r\n\tvolup 0\r\n\r\n\tlogComment ====== bootToUEFIMenu finish ======\r\n\r\ndef bootToFastboot()\r\n\tlogComment ====== bootToFastboot start ======\r\n\r\n\tpowerOffTheDevice\r\n\r\n\tpkey 0\r\n\tvolup 0\r\n\tvoldn 1\r\n\r\n\tpedl 0\r\n\r\n\tpowerOnTheDevice\r\n\r\n\tpkey 1\r\n\tdelay 800\r\n\tpkey 0\r\n\r\n\tdelay $fastboot\r\n\tvoldn 0\r\n\tdelay 30\r\n\tvoldn 1\r\n\r\n\tvoldn 0\r\n\r\n\tlogComment ====== bootToFastboot finished ======\r\n", "supportedFirmwareVer": [ 15 ], "pins": [ { "command": "eud", "initial_value": false, "inverted": false, "pin_number": "15", "classic_action": "TAC_SOFT_RESET", "initialization_priority": -1 }, { "command": "uim1", "initial_value": false, "inverted": false, "pin_number": "18", "classic_action": "TAC_UIM1_DIS", "initialization_priority": -1 }, { "command": "uim2", "initial_value": false, "inverted": false, "pin_number": "19", "classic_action": "TAC_UIM2_DIS", "initialization_priority": -1 }, { "command": "headset", "initial_value": false, "inverted": false, "pin_number": "21", "classic_action": "TAC_HEADSET_DIS", "initialization_priority": -1 }, { "command": "", "initial_value": false, "inverted": false, "pin_number": "29", "classic_action": "", "initialization_priority": -1 }, { "command": "sedl", "initial_value": false, "inverted": false, "pin_number": "30", "classic_action": "TAC_FORCE_USB_BOOT_SEC", "initialization_priority": -1 }, { "command": "sresn", "initial_value": false, "inverted": false, "pin_number": "31", "classic_action": "TAC_RESET_SEC", "initialization_priority": -1 }, { "command": "volup", "initial_value": false, "inverted": false, "pin_number": "34", "classic_action": "TAC_VOL_UP", "initialization_priority": -1 }, { "command": "usb1", "initial_value": false, "inverted": true, "pin_number": "36", "classic_action": "TAC_USB1_DIS", "initialization_priority": 2 }, { "command": "pshold", "initial_value": false, "inverted": false, "pin_number": "38", "classic_action": "", "initialization_priority": -1 }, { "command": "", "initial_value": false, "inverted": false, "pin_number": "39", "classic_action": "", "initialization_priority": -1 }, { "command": "", "initial_value": false, "inverted": false, "pin_number": "46", "classic_action": "", "initialization_priority": -1 }, { "command": "sdcard", "initial_value": false, "inverted": false, "pin_number": "47", "classic_action": "TAC_SDCARD_DISC", "initialization_priority": -1 }, { "command": "", "initial_value": false, "inverted": false, "pin_number": "48", "classic_action": "", "initialization_priority": -1 }, { "command": "", "initial_value": false, "inverted": false, "pin_number": "49", "classic_action": "", "initialization_priority": -1 }, { "command": "pkey", "initial_value": false, "inverted": false, "pin_number": "50", "classic_action": "TAC_TC_START", "initialization_priority": -1 }, { "command": "voldn", "initial_value": false, "inverted": false, "pin_number": "51", "classic_action": "TAC_RESET_PRI", "initialization_priority": -1 }, { "command": "battery", "initial_value": false, "inverted": true, "pin_number": "53", "classic_action": "TAC_POWER_OFF", "initialization_priority": 2 }, { "command": "pedl", "initial_value": false, "inverted": false, "pin_number": "54", "classic_action": "TAC_SW_DWNLD_PRI", "initialization_priority": -1 }, { "command": "usb0", "initial_value": false, "inverted": true, "pin_number": "55", "classic_action": "TAC_USB0_DIS", "initialization_priority": 2 } ], "variables": [ { "default_value": "1300", "name": "edl" }, { "default_value": "8000", "name": "fastboot" }, { "default_value": "8000", "name": "uefi" } ] } pytactl-3.2/pytactl/tac_configs/TAC_PSOC_82.pinout.json000066400000000000000000000203361526550266300227670ustar00rootroot00000000000000{ "$schema": "https://qualcomm.github.io/tac/schemas/pinout-1.0.json", "format": "tac-pinout", "schema_version": "1.0", "source": { "repository": "https://github.com/qualcomm/qcom-test-automation-controller.git", "commit": "757cc972c88e4a1098881b2bc73f3d53eac286be", "path": "configurations", "file": "TAC_PSOC_82.tcnf" }, "description": "SHIKRA PSOC", "name": "SHIKRA PSOC", "platform_id": 82, "platform_type": "PSOC", "reset_enabled": false, "script": "def powerOffTheDevice() \r\n\tlogComment ====== powerOffTheDevice sequence start ======\r\n\r\n\tbattery 1\r\n\tusb0 1\r\n\tusb1 1\r\n\r\n\tlogComment ====== powerOffTheDevice sequence finish ======\r\n\r\ndef powerOnTheDevice()\r\n\tlogComment ====== powerOnTheDevice sequence start ======\r\n\r\n\tdelay 500\r\n\tbattery 0\r\n\tdelay 900\r\n\tusb0 0\r\n\tusb1 0\r\n\tdelay 30\r\n\r\n\tlogComment ====== powerOnTheDevice sequence finish ======\r\n\r\ndef powerOff()\r\n\tlogComment ====== powerOff start ======\r\n\r\n\tpowerOffTheDevice\r\n\r\n\tpkey 0\r\n\tvolup 0\r\n\tvoldn 0\r\n\r\n\tpedl 0\r\n\r\n\tlogComment ====== powerOff finish ======\r\n\r\ndef powerOn()\r\n\tlogComment ====== powerOn start ======\r\n\r\n\tpowerOff\r\n\r\n\tpowerOnTheDevice\r\n\r\n\tpkey 1\r\n\tdelay 800\r\n\tpkey 0\r\n\r\n\tlogComment ====== powerOn finish ======\r\n\r\ndef bootToEDL()\r\n\tlogComment ====== bootToEDL start ======\r\n\r\n\tpowerOffTheDevice\r\n\r\n\tpkey 0\r\n\tvolup 0\r\n\tvoldn 0\r\n\r\n\tpedl 1\r\n\r\n\tpowerOnTheDevice\r\n\r\n\tpkey 1\r\n\tdelay $edl\r\n\tpkey 0\r\n\r\n\tpedl 0\r\n\r\n\tlogComment ====== bootToEDL finish ======\r\n\r\ndef bootToSecondaryEDL()\r\n\tlogComment ====== bootToSecondaryEDL start ======\r\n\r\n\tpowerOffTheDevice\r\n\r\n\tpkey 0\r\n\tvolup 0\r\n\tvoldn 0\r\n\r\n\tsedl 1\r\n\r\n\tpowerOnTheDevice\r\n\r\n\tpkey 1\r\n\tdelay 800\r\n\tpkey 0\r\n\r\n\tdelay 1300\r\n\r\n\tsedl 0\r\n\r\n\tlogComment ====== bootToSecondaryEDL finish ======\r\n\r\ndef bootToUEFI()\r\n\tlogComment ====== bootToUEFIMenu start ======\r\n\r\n\tpowerOffTheDevice\r\n\r\n\t// Put buttons in a set state\r\n\tpkey 0\r\n\tvolup 1\r\n\tvoldn 0\r\n\r\n\tpedl 0\r\n\r\n\tpowerOnTheDevice\r\n\r\n\tpkey 1\r\n\tdelay $uefi\r\n\tpkey 0\r\n\tvolup 0\r\n\tdelay 12\r\n\tpkey 1\r\n\tvolup 1\r\n\r\n\tpkey 0\r\n\tvolup 0\r\n\r\n\tlogComment ====== bootToUEFIMenu finish ======\r\n\r\ndef bootToFastboot()\r\n\tlogComment ====== bootToFastboot start ======\r\n\r\n\tpowerOffTheDevice\r\n\r\n\tpkey 0\r\n\tvolup 0\r\n\tvoldn 1\r\n\r\n\tpedl 0\r\n\r\n\tpowerOnTheDevice\r\n\r\n\tpkey 1\r\n\tdelay 800\r\n\tpkey 0\r\n\r\n\tdelay $fastboot\r\n\tvoldn 0\r\n\tdelay 30\r\n\tvoldn 1\r\n\r\n\tvoldn 0\r\n\r\n\tlogComment ====== bootToFastboot finished ======\r\n", "supportedFirmwareVer": [ 15, 18 ], "usb_descriptor": "", "pins": [ { "classic_action": "TAC_SOFT_RESET", "command": "eud", "initial_value": false, "initialization_priority": -1, "inverted": false, "pin_number": "15" }, { "classic_action": "TC_EUD_EARLY_BOOT_EN", "command": "uim1", "initial_value": false, "initialization_priority": -1, "inverted": true, "pin_number": "16" }, { "classic_action": "TAC_UIM1_DIS", "command": "uim2", "initial_value": false, "initialization_priority": -1, "inverted": true, "pin_number": "18" }, { "classic_action": "TAC_UIM2_DIS", "command": "uim2", "initial_value": false, "initialization_priority": -1, "inverted": false, "pin_number": "19" }, { "classic_action": "TAC_HEADSET_DIS", "command": "headset", "initial_value": false, "initialization_priority": -1, "inverted": false, "pin_number": "21" }, { "classic_action": "", "command": "", "initial_value": false, "initialization_priority": -1, "inverted": false, "pin_number": "29" }, { "classic_action": "TAC_FORCE_USB_BOOT_SEC", "command": "sedl", "initial_value": false, "initialization_priority": -1, "inverted": false, "pin_number": "30" }, { "classic_action": "TAC_RESET_SEC", "command": "sresn", "initial_value": false, "initialization_priority": -1, "inverted": false, "pin_number": "31" }, { "classic_action": "TAC_VOL_UP", "command": "volup", "initial_value": false, "initialization_priority": -1, "inverted": false, "pin_number": "34" }, { "classic_action": "TAC_USB1_DIS", "command": "usb1", "initial_value": false, "initialization_priority": 2, "inverted": false, "pin_number": "36" }, { "classic_action": "TAC_FORCE_PS_HOLD", "command": "pshold", "initial_value": false, "initialization_priority": -1, "inverted": false, "pin_number": "37" }, { "classic_action": "", "command": "", "initial_value": false, "initialization_priority": -1, "inverted": false, "pin_number": "38" }, { "classic_action": "", "command": "", "initial_value": false, "initialization_priority": -1, "inverted": false, "pin_number": "39" }, { "classic_action": "", "command": "", "initial_value": false, "initialization_priority": -1, "inverted": false, "pin_number": "46" }, { "classic_action": "TAC_SDCARD_DISC", "command": "sdcard", "initial_value": false, "initialization_priority": -1, "inverted": false, "pin_number": "47" }, { "classic_action": "", "command": "", "initial_value": false, "initialization_priority": -1, "inverted": false, "pin_number": "48" }, { "classic_action": "", "command": "", "initial_value": false, "initialization_priority": -1, "inverted": false, "pin_number": "49" }, { "classic_action": "TAC_TC_START", "command": "pkey", "initial_value": false, "initialization_priority": -1, "inverted": false, "pin_number": "50" }, { "classic_action": "TAC_RESET_PRI", "command": "voldn", "initial_value": false, "initialization_priority": -1, "inverted": false, "pin_number": "51" }, { "classic_action": "TAC_POWER_OFF", "command": "battery", "initial_value": false, "initialization_priority": 2, "inverted": true, "pin_number": "53" }, { "classic_action": "TAC_SW_DWNLD_PRI", "command": "pedl", "initial_value": false, "initialization_priority": -1, "inverted": false, "pin_number": "54" }, { "classic_action": "TAC_USB0_DIS", "command": "usb0", "initial_value": false, "initialization_priority": 2, "inverted": true, "pin_number": "55" } ], "variables": [ { "default_value": "1300", "name": "edl" }, { "default_value": "8000", "name": "fastboot" }, { "default_value": "8000", "name": "uefi" } ] } pytactl-3.2/pytactl/tac_configs/TAC_PSOC_87.pinout.json000066400000000000000000000203471526550266300227760ustar00rootroot00000000000000{ "$schema": "https://qualcomm.github.io/tac/schemas/pinout-1.0.json", "format": "tac-pinout", "schema_version": "1.0", "source": { "repository": "https://github.com/qualcomm/qcom-test-automation-controller.git", "commit": "954c804e694e8b7d7e8fc71c105d66c3f4742d20", "path": "configurations", "file": "TAC_PSOC_87.tcnf" }, "description": "HAWI QRD PSOC", "name": "HAWI QRD", "platform_id": 87, "platform_type": "PSOC", "reset_enabled": false, "script": "def powerOffTheDevice() \r\n\tlogComment ====== powerOffTheDevice sequence start ======\r\n\r\n\tbattery 1\r\n\tusb0 1\r\n\tusb1 1\r\n\r\n\tlogComment ====== powerOffTheDevice sequence finish ======\r\n\r\ndef powerOnTheDevice()\r\n\tlogComment ====== powerOnTheDevice sequence start ======\r\n\r\n\tdelay 500\r\n\tbattery 0\r\n\tdelay 900\r\n\tusb0 0\r\n\tusb1 0\r\n\tdelay 30\r\n\r\n\tlogComment ====== powerOnTheDevice sequence finish ======\r\n\r\ndef powerOff()\r\n\tlogComment ====== powerOff start ======\r\n\r\n\tpowerOffTheDevice\r\n\r\n\tpkey 0\r\n\tvolup 0\r\n\tvoldn 0\r\n\r\n\tpedl 0\r\n\r\n\tlogComment ====== powerOff finish ======\r\n\r\ndef powerOn()\r\n\tlogComment ====== powerOn start ======\r\n\r\n\tpowerOff\r\n\r\n\tpowerOnTheDevice\r\n\r\n\tpkey 1\r\n\tdelay 800\r\n\tpkey 0\r\n\r\n\tlogComment ====== powerOn finish ======\r\n\r\ndef bootToEDL()\r\n\tlogComment ====== bootToEDL start ======\r\n\r\n\tpowerOffTheDevice\r\n\r\n\tpkey 0\r\n\tvolup 0\r\n\tvoldn 0\r\n\r\n\tpedl 1\r\n\r\n\tpowerOnTheDevice\r\n\r\n\tpkey 1\r\n\tdelay $edl\r\n\tpkey 0\r\n\r\n\tpedl 0\r\n\r\n\tlogComment ====== bootToEDL finish ======\r\n\r\ndef bootToSecondaryEDL()\r\n\tlogComment ====== bootToSecondaryEDL start ======\r\n\r\n\tpowerOffTheDevice\r\n\r\n\tpkey 0\r\n\tvolup 0\r\n\tvoldn 0\r\n\r\n\tsedl 1\r\n\r\n\tpowerOnTheDevice\r\n\r\n\tpkey 1\r\n\tdelay 800\r\n\tpkey 0\r\n\r\n\tdelay 1300\r\n\r\n\tsedl 0\r\n\r\n\tlogComment ====== bootToSecondaryEDL finish ======\r\n\r\ndef bootToUEFI()\r\n\tlogComment ====== bootToUEFIMenu start ======\r\n\r\n\tpowerOffTheDevice\r\n\r\n\t// Put buttons in a set state\r\n\tpkey 0\r\n\tvolup 1\r\n\tvoldn 0\r\n\r\n\tpedl 0\r\n\r\n\tpowerOnTheDevice\r\n\r\n\tpkey 1\r\n\tdelay $uefi\r\n\tpkey 0\r\n\tvolup 0\r\n\tdelay 12\r\n\tpkey 1\r\n\tvolup 1\r\n\r\n\tpkey 0\r\n\tvolup 0\r\n\r\n\tlogComment ====== bootToUEFIMenu finish ======\r\n\r\ndef bootToFastboot()\r\n\tlogComment ====== bootToFastboot start ======\r\n\r\n\tpowerOffTheDevice\r\n\r\n\tpkey 0\r\n\tvolup 0\r\n\tvoldn 1\r\n\r\n\tpedl 0\r\n\r\n\tpowerOnTheDevice\r\n\r\n\tpkey 1\r\n\tdelay 800\r\n\tpkey 0\r\n\r\n\tdelay $fastboot\r\n\tvoldn 0\r\n\tdelay 30\r\n\tvoldn 1\r\n\r\n\tvoldn 0\r\n\r\n\tlogComment ====== bootToFastboot finished ======\r\n", "supportedFirmwareVer": [ 15, 18, 19 ], "usb_descriptor": "", "pins": [ { "classic_action": "TAC_SOFT_RESET", "command": "", "initial_value": false, "initialization_priority": -1, "inverted": false, "pin_number": "15" }, { "classic_action": "TC_EUD_EARLY_BOOT_EN", "command": "eud", "initial_value": false, "initialization_priority": -1, "inverted": false, "pin_number": "16" }, { "classic_action": "TAC_UIM1_DIS", "command": "uim1", "initial_value": false, "initialization_priority": -1, "inverted": false, "pin_number": "18" }, { "classic_action": "TAC_UIM2_DIS", "command": "uim2", "initial_value": false, "initialization_priority": -1, "inverted": false, "pin_number": "19" }, { "classic_action": "TAC_HEADSET_DIS", "command": "headset", "initial_value": false, "initialization_priority": -1, "inverted": false, "pin_number": "21" }, { "classic_action": "", "command": "", "initial_value": false, "initialization_priority": -1, "inverted": false, "pin_number": "29" }, { "classic_action": "TAC_FORCE_USB_BOOT_SEC", "command": "sedl", "initial_value": false, "initialization_priority": -1, "inverted": false, "pin_number": "30" }, { "classic_action": "TAC_RESET_SEC", "command": "sresn", "initial_value": false, "initialization_priority": -1, "inverted": false, "pin_number": "31" }, { "classic_action": "TAC_VOL_UP", "command": "volup", "initial_value": false, "initialization_priority": -1, "inverted": false, "pin_number": "34" }, { "classic_action": "TAC_USB1_DIS", "command": "usb1", "initial_value": false, "initialization_priority": 2, "inverted": false, "pin_number": "36" }, { "classic_action": "TAC_FORCE_PS_HOLD", "command": "pshold", "initial_value": false, "initialization_priority": -1, "inverted": false, "pin_number": "37" }, { "classic_action": "", "command": "", "initial_value": false, "initialization_priority": -1, "inverted": false, "pin_number": "38" }, { "classic_action": "", "command": "", "initial_value": false, "initialization_priority": -1, "inverted": false, "pin_number": "39" }, { "classic_action": "", "command": "", "initial_value": false, "initialization_priority": -1, "inverted": false, "pin_number": "46" }, { "classic_action": "TAC_SDCARD_DISC", "command": "sdcard", "initial_value": false, "initialization_priority": -1, "inverted": false, "pin_number": "47" }, { "classic_action": "", "command": "", "initial_value": false, "initialization_priority": -1, "inverted": false, "pin_number": "48" }, { "classic_action": "", "command": "", "initial_value": false, "initialization_priority": -1, "inverted": false, "pin_number": "49" }, { "classic_action": "TAC_TC_START", "command": "pkey", "initial_value": false, "initialization_priority": -1, "inverted": false, "pin_number": "50" }, { "classic_action": "TAC_RESET_PRI", "command": "voldn", "initial_value": false, "initialization_priority": -1, "inverted": false, "pin_number": "51" }, { "classic_action": "TAC_POWER_OFF", "command": "battery", "initial_value": false, "initialization_priority": 2, "inverted": true, "pin_number": "53" }, { "classic_action": "TAC_SW_DWNLD_PRI", "command": "pedl", "initial_value": false, "initialization_priority": -1, "inverted": false, "pin_number": "54" }, { "classic_action": "TAC_USB0_DIS", "command": "usb0", "initial_value": false, "initialization_priority": 2, "inverted": true, "pin_number": "55" } ], "variables": [ { "default_value": "1300", "name": "edl" }, { "default_value": "8000", "name": "fastboot" }, { "default_value": "8000", "name": "uefi" } ] } pytactl-3.2/pytactl/tac_configs/devicelist.json000066400000000000000000000633111526550266300220410ustar00rootroot00000000000000{ "catalog": [ { "configPath": "TAC_FTDI_13.pinout.json", "debugBoardType": 2, "description": "SPM V4", "name": "SPM V4", "platform_id": 1, "revision": 0, "usb_descriptor": "" }, { "configPath": "TAC_FTDI_13.pinout.json", "debugBoardType": 2, "description": "EPM V4", "name": "EPM V4", "platform_id": 2, "revision": 0, "usb_descriptor": "" }, { "configPath": "TAC_FTDI_13.pinout.json", "debugBoardType": 2, "description": "Alpaca V1", "name": "Alpaca V1", "platform_id": 3, "revision": 0, "usb_descriptor": "" }, { "configPath": "TAC_FTDI_13.pinout.json", "debugBoardType": 2, "description": "MicroEPM TAC", "name": "MicroEPM TAC", "platform_id": 4, "revision": 0, "usb_descriptor": "" }, { "configPath": "TAC_FTDI_13.pinout.json", "debugBoardType": 2, "description": "Alpaca V2", "name": "Alpaca V2", "platform_id": 5, "revision": 0, "usb_descriptor": "" }, { "configPath": "TAC_FTDI_13.pinout.json", "debugBoardType": 2, "description": "Alpaca V3.0", "name": "Alpaca V3.0", "platform_id": 6, "revision": 0, "usb_descriptor": "" }, { "configPath": "TAC_PSOC_7.pinout.json", "debugBoardType": 2, "description": "Alpaca V3.1", "name": "Alpaca V3.1", "platform_id": 7, "revision": 1, "usb_descriptor": "" }, { "configPath": "TAC_FTDI_13.pinout.json", "debugBoardType": 2, "description": "MTP V3.2", "name": "MTP V3.2", "platform_id": 8, "revision": 0, "usb_descriptor": "" }, { "configPath": "TAC_FTDI_13.pinout.json", "debugBoardType": 2, "description": "QRD V1.0", "name": "QRD V1.0", "platform_id": 9, "revision": 0, "usb_descriptor": "" }, { "configPath": "TAC_FTDI_13.pinout.json", "debugBoardType": 2, "description": "IDP V1.0", "name": "IDP V1.0", "platform_id": 10, "revision": 0, "usb_descriptor": "" }, { "configPath": "TAC_FTDI_13.pinout.json", "debugBoardType": 2, "description": "Dongle V3.0", "name": "Dongle V3.0", "platform_id": 11, "revision": 0, "usb_descriptor": "" }, { "configPath": "TAC_FTDI_13.pinout.json", "debugBoardType": 2, "description": "MTP V3.3", "name": "MTP V3.3", "platform_id": 12, "revision": 0, "usb_descriptor": "" }, { "chip1BusSet": 12, "chip2BusSet": 0, "chip3BusSet": 0, "chip4BusSet": 0, "configPath": "TAC_FTDI_13.pinout.json", "debugBoardType": 3, "description": "ALPACA LITE (FTDI)", "name": "ALPACA LITE (FTDI)", "platform_id": 13, "revision": 0, "usb_descriptor": "" }, { "configPath": "TAC_PSOC_14.pinout.json", "debugBoardType": 2, "description": "CSM - PSoC version", "name": "CSM - PSoC", "platform_id": 14, "revision": 17, "usb_descriptor": "" }, { "chip1BusSet": 12, "chip2BusSet": 0, "chip3BusSet": 0, "chip4BusSet": 0, "configPath": "TAC_FTDI_15.pinout.json", "debugBoardType": 3, "description": "CSM - Lite", "name": "CSM Lite", "platform_id": 15, "revision": 1, "usb_descriptor": "ALPACA-LITE CSM DEBUG BOARD" }, { "chip1BusSet": 12, "chip2BusSet": 0, "chip3BusSet": 0, "chip4BusSet": 0, "configPath": "TAC_FTDI_16.pinout.json", "debugBoardType": 3, "description": "CSM - X100", "name": "CSM X100", "platform_id": 16, "revision": 19, "usb_descriptor": "ALPACA-LITE CSM X100 DEBUG" }, { "configPath": "TAC_PSOC_17.pinout.json", "debugBoardType": 2, "description": "Lemans ADP TAC PSOC", "name": "Lemans ADP Automotive", "platform_id": 17, "revision": 55, "usb_descriptor": "" }, { "chip1BusSet": 15, "chip2BusSet": 0, "chip3BusSet": 0, "chip4BusSet": 0, "configPath": "TAC_FTDI_18.pinout.json", "debugBoardType": 3, "description": "FTDI TAC for RIDE MX 4.0", "name": "RIDE MX 4.0 Lite", "platform_id": 18, "revision": 114, "usb_descriptor": "RIDE MX 4.0 Lite" }, { "chip1BusSet": 12, "chip2BusSet": 0, "chip3BusSet": 0, "chip4BusSet": 0, "configPath": "TAC_FTDI_19.pinout.json", "debugBoardType": 3, "description": "Hamoa Lite", "name": "Hamoa Lite", "platform_id": 19, "revision": 28, "usb_descriptor": "Hamoa Lite" }, { "chip1BusSet": 12, "chip2BusSet": 0, "chip3BusSet": 0, "chip4BusSet": 0, "configPath": "TAC_FTDI_20.pinout.json", "debugBoardType": 3, "description": "FTDI-LITE SDX75 CPE", "name": "SDX75 CPE", "platform_id": 20, "revision": 27, "usb_descriptor": "ALPACA-LITE SDX75 CPE" }, { "chip1BusSet": 12, "chip2BusSet": 0, "chip3BusSet": 0, "chip4BusSet": 0, "configPath": "TAC_FTDI_21.pinout.json", "debugBoardType": 3, "description": "ALPACA LITE IDP35", "name": "KUNO IDP35", "platform_id": 21, "revision": 10, "usb_descriptor": "ALPACA-LITE IDP35" }, { "chip1BusSet": 12, "chip2BusSet": 0, "chip3BusSet": 0, "chip4BusSet": 0, "configPath": "TAC_FTDI_22.pinout.json", "debugBoardType": 3, "description": "FTDI-LITE SDX75 QMP", "name": "SDX75 QMP", "platform_id": 22, "revision": 1, "usb_descriptor": "ALPACA-LITE SDX75 QMP" }, { "chip1BusSet": 12, "chip2BusSet": 0, "chip3BusSet": 0, "chip4BusSet": 0, "configPath": "TAC_FTDI_23.pinout.json", "debugBoardType": 3, "description": "FTDI-LITE SDX75 M.2", "name": "SDX75 M.2", "platform_id": 23, "revision": 2, "usb_descriptor": "ALPACA-LITE SDX75 M.2" }, { "configPath": "TAC_PSOC_24.pinout.json", "debugBoardType": 2, "description": "CSM - PSoC version", "name": "CSM - X100 - PSoC", "platform_id": 24, "revision": 4, "usb_descriptor": "" }, { "chip1BusSet": 12, "chip2BusSet": 0, "chip3BusSet": 0, "chip4BusSet": 0, "configPath": "TAC_FTDI_25.pinout.json", "debugBoardType": 3, "description": "ALPACA-LITE SDX35 M.2", "name": "ALPACA-LITE SDX35 M.2", "platform_id": 25, "revision": 18, "usb_descriptor": "ALPACA-LITE SDX35 M.2" }, { "chip1BusSet": 12, "chip2BusSet": 0, "chip3BusSet": 0, "chip4BusSet": 0, "configPath": "TAC_FTDI_26.pinout.json", "debugBoardType": 3, "description": "ALPACA-LITE KUNO DEBUG BOARD", "name": "KUNO DEBUG BOARD", "platform_id": 26, "revision": 17, "usb_descriptor": "ALPACA-LITE KUNO DEBUG BOARD" }, { "chip1BusSet": 12, "chip2BusSet": 0, "chip3BusSet": 0, "chip4BusSet": 0, "configPath": "TAC_FTDI_27.pinout.json", "debugBoardType": 3, "description": "Lanai FTDI debug board", "name": "Lanai Debug", "platform_id": 27, "revision": 5, "usb_descriptor": "ALPACA-LITE LANAI DEBUG BOARD" }, { "chip1BusSet": 12, "chip2BusSet": 0, "chip3BusSet": 0, "chip4BusSet": 0, "configPath": "TAC_FTDI_28.pinout.json", "debugBoardType": 3, "description": "ALPACA-LITE CDPS35", "name": "KUNO CDPS35", "platform_id": 28, "revision": 82, "usb_descriptor": "ALPACA-LITE CDPS35" }, { "chip1BusSet": 4, "chip2BusSet": 0, "chip3BusSet": 0, "chip4BusSet": 0, "configPath": "TAC_FTDI_29.pinout.json", "debugBoardType": 3, "description": "ALPACA-LITE SWITCH CONTROL", "name": "RF Switch Box", "platform_id": 29, "revision": 83, "usb_descriptor": "ALPACA-LITE SWITCH CONTROL" }, { "chip1BusSet": 6, "chip2BusSet": 0, "chip3BusSet": 0, "chip4BusSet": 0, "configPath": "TAC_FTDI_30.pinout.json", "debugBoardType": 3, "description": "Disable UART to collect BootKPI", "name": "Qualcomm AIR 8775", "platform_id": 30, "revision": 6, "usb_descriptor": "ALPACA-LITE AIR 8775" }, { "configPath": "TAC_PSOC_31.pinout.json", "debugBoardType": 2, "description": "CCARD525 PSoC", "name": "CCARD525", "platform_id": 31, "revision": 40, "usb_descriptor": "" }, { "chip1BusSet": 12, "chip2BusSet": 0, "chip3BusSet": 0, "chip4BusSet": 0, "configPath": "TAC_FTDI_32.pinout.json", "debugBoardType": 3, "description": "ALPACA-LITE for Mobile/Compute/Modem_NS ATP debug board", "name": "ATP SM-SC-SDX_NS DEBUG BOARD", "platform_id": 32, "revision": 22, "usb_descriptor": "ALPACA-LITE SM_SC_SDX ATP" }, { "chip1BusSet": 12, "chip2BusSet": 0, "chip3BusSet": 0, "chip4BusSet": 0, "configPath": "TAC_FTDI_33.pinout.json", "debugBoardType": 3, "description": "ALPACA-LITE QCX217", "name": "ALPACA-LITE QCX217", "platform_id": 33, "revision": 21, "usb_descriptor": "ALPACA-LITE QCX217" }, { "configPath": "TAC_PSOC_35.pinout.json", "debugBoardType": 2, "description": "RB5 ", "name": "RB5", "platform_id": 35, "revision": 45, "usb_descriptor": "" }, { "chip1BusSet": 12, "chip2BusSet": 0, "chip3BusSet": 0, "chip4BusSet": 0, "configPath": "TAC_FTDI_36.pinout.json", "debugBoardType": 3, "description": "XR TAC Config for Matrix v2", "name": "XR TAC Config ", "platform_id": 36, "revision": 5, "usb_descriptor": "ALPACA-LITE FOR XR V1" }, { "chip1BusSet": 12, "chip2BusSet": 0, "chip3BusSet": 0, "chip4BusSet": 0, "configPath": "TAC_FTDI_37.pinout.json", "debugBoardType": 3, "description": "FTDI TAC for RIDE MICRO 4.0", "name": "RIDE MICRO 4.0", "platform_id": 37, "revision": 7, "usb_descriptor": "RIDE MICRO 4.0" }, { "chip1BusSet": 12, "chip2BusSet": 0, "chip3BusSet": 0, "chip4BusSet": 0, "configPath": "TAC_FTDI_38.pinout.json", "debugBoardType": 3, "description": "PAKALA CDP with GG GPIOs", "name": "PAKALA CDP", "platform_id": 38, "revision": 44, "usb_descriptor": "ALPACA-LITE PAKALA CDP" }, { "chip1BusSet": 12, "chip2BusSet": 0, "chip3BusSet": 0, "chip4BusSet": 0, "configPath": "TAC_FTDI_39.pinout.json", "debugBoardType": 3, "description": "FTDI TAC for RB8 IQ-9075-EVK", "name": "RB8 IQ-9075-EVK", "platform_id": 39, "revision": 8, "usb_descriptor": "ALPACA-LITE FOR RB8 IQ-9075-EVK" }, { "chip1BusSet": 12, "chip2BusSet": 0, "chip3BusSet": 0, "chip4BusSet": 0, "configPath": "TAC_FTDI_40.pinout.json", "debugBoardType": 3, "description": "KAANAPALI CDP with GG GPIOs", "name": "KAANAPALI CDP", "platform_id": 40, "revision": 79, "usb_descriptor": "ALPACA-LITE KAANAPALI CDP" }, { "chip1BusSet": 12, "chip2BusSet": 0, "chip3BusSet": 0, "chip4BusSet": 0, "configPath": "TAC_FTDI_41.pinout.json", "debugBoardType": 3, "description": "ALPACA-LITE for AP-MDM Fusion ATP debug board", "name": "SDX-SM_FUSION ATP DEBUG BOARD", "platform_id": 41, "revision": 60, "usb_descriptor": "ALPACA-LITE SDX_FUS_ATP" }, { "chip1BusSet": 8, "chip2BusSet": 0, "chip3BusSet": 0, "chip4BusSet": 0, "configPath": "TAC_FTDI_42.pinout.json", "debugBoardType": 3, "description": "ALPACA-LITE SMART LABEL", "name": "ALPACA-LITE SMART LABEL", "platform_id": 42, "revision": 53, "usb_descriptor": "ALPACA-LITE SMART LABEL" }, { "configPath": "TAC_PSOC_44.pinout.json", "debugBoardType": 2, "description": "Kanapali QRD", "name": "Kanapali QRD", "platform_id": 44, "revision": 2, "usb_descriptor": "" }, { "chip1BusSet": 12, "chip2BusSet": 0, "chip3BusSet": 0, "chip4BusSet": 0, "configPath": "TAC_FTDI_45.pinout.json", "debugBoardType": 3, "description": "Glymur SIP V2 Alpaca Lite", "name": "Glymur SIP Lite", "platform_id": 45, "revision": 64, "usb_descriptor": "ALPACA-LITE SIP12 QCB8480X GLYMUR" }, { "chip1BusSet": 12, "chip2BusSet": 0, "chip3BusSet": 0, "chip4BusSet": 0, "configPath": "TAC_FTDI_48.pinout.json", "debugBoardType": 3, "description": "MTP8850 FTDI IO", "name": "Kaanapali MTP", "platform_id": 48, "revision": 52, "usb_descriptor": "ALPACA-LITE MTP8850" }, { "chip1BusSet": 12, "chip2BusSet": 0, "chip3BusSet": 0, "chip4BusSet": 0, "configPath": "TAC_FTDI_49.pinout.json", "debugBoardType": 3, "description": "Glymur COB CDPS", "name": "Glymur COB CDPS", "platform_id": 49, "revision": 17, "usb_descriptor": "ALPACA-LITE GLYMUR COB CDPS" }, { "configPath": "TAC_FTDI_13.pinout.json", "debugBoardType": 4, "description": "Default Automotive (PIC32CX)", "name": "Default Automotive (PIC32CX)", "platform_id": 50, "revision": 0, "usb_descriptor": "" }, { "chip1BusSet": 12, "chip2BusSet": 0, "chip3BusSet": 0, "chip4BusSet": 0, "configPath": "TAC_FTDI_51.pinout.json", "debugBoardType": 3, "description": "ALPACA-LITE GLYMUR COB QCB", "name": "Glymur CoB QCB", "platform_id": 51, "revision": 15, "usb_descriptor": "ALPACA-LITE GLYMUR COB QCB" }, { "chip1BusSet": 12, "chip2BusSet": 0, "chip3BusSet": 0, "chip4BusSet": 0, "configPath": "TAC_FTDI_52.pinout.json", "debugBoardType": 3, "description": "Glymur QCB V1 Alpaca Lite With battery", "name": "Glymur CoB QCB WITH BATTERY", "platform_id": 52, "revision": 24, "usb_descriptor": "ALPACA-LITE GLYMUR COB QCB BATT" }, { "configPath": "TAC_PIC32CXAuto_54.pinout.json", "debugBoardType": 4, "description": "NordAu RIDE", "name": "NordAu RIDE", "platform_id": 54, "revision": 6, "usb_descriptor": "KARUSSELL" }, { "chip1BusSet": 12, "chip2BusSet": 0, "chip3BusSet": 0, "chip4BusSet": 0, "configPath": "TAC_FTDI_55.pinout.json", "debugBoardType": 3, "description": "AR TAC config for Balsam", "name": "Balsam SAR2230P", "platform_id": 55, "revision": 22, "usb_descriptor": "ALPACA-LITE FOR AR V1" }, { "chip1BusSet": 12, "chip2BusSet": 0, "chip3BusSet": 0, "chip4BusSet": 0, "configPath": "TAC_FTDI_56.pinout.json", "debugBoardType": 3, "description": "MTP8845 FTDI IO", "name": "Molokai MTP", "platform_id": 56, "revision": 65, "usb_descriptor": "ALPACA-LITE MTP8845" }, { "configPath": "TAC_PSOC_57.pinout.json", "debugBoardType": 2, "description": "Monaco/Lemans ADP Automotive", "name": "Monaco/Lemans RIDE MCU Less ADP Automotive", "platform_id": 57, "revision": 177, "usb_descriptor": "" }, { "chip1BusSet": 12, "chip2BusSet": 0, "chip3BusSet": 0, "chip4BusSet": 0, "configPath": "TAC_FTDI_60.pinout.json", "debugBoardType": 3, "description": "Glymur Battery Enabled Device", "name": "Glymur Battery Enabled Device", "platform_id": 60, "revision": 55, "usb_descriptor": "ALPACA-LITE GLYMUR CRD BATTERY" }, { "chip1BusSet": 12, "chip2BusSet": 0, "chip3BusSet": 0, "chip4BusSet": 0, "configPath": "TAC_FTDI_63.pinout.json", "debugBoardType": 3, "description": "AR TAC config for BONSAI", "name": "Bonsai XRV7205", "platform_id": 63, "revision": 26, "usb_descriptor": "ALPACA-LITE FOR AR V1" }, { "chip1BusSet": 12, "chip2BusSet": 0, "chip3BusSet": 0, "chip4BusSet": 0, "configPath": "TAC_FTDI_64.pinout.json", "debugBoardType": 3, "description": "FTDI-LITE SDX95 QMP", "name": "SDX95 QMP", "platform_id": 64, "revision": 8, "usb_descriptor": "ALPACA-LITE SDX95 QMP" }, { "chip1BusSet": 12, "chip2BusSet": 0, "chip3BusSet": 0, "chip4BusSet": 0, "configPath": "TAC_FTDI_65.pinout.json", "debugBoardType": 3, "description": "MTP8975 (Hawi) FTDI IO", "name": "Hawi MTP8975", "platform_id": 65, "revision": 26, "usb_descriptor": "ALPACA-LITE MTP8975" }, { "configPath": "TAC_PSOC_66.pinout.json", "debugBoardType": 2, "description": "Hawi MTP8975 - PSoC", "name": "Hawi MTP8975", "platform_id": 66, "revision": 86, "usb_descriptor": "" }, { "chip1BusSet": 15, "chip2BusSet": 0, "chip3BusSet": 0, "chip4BusSet": 0, "configPath": "TAC_FTDI_67.pinout.json", "debugBoardType": 3, "description": "TDP535 Platform Config", "name": "AmboseliAQ Lite", "platform_id": 67, "revision": 120, "usb_descriptor": "ALPACA-LITE TDP535 BOARD" }, { "chip1BusSet": 12, "chip2BusSet": 0, "chip3BusSet": 0, "chip4BusSet": 0, "configPath": "TAC_FTDI_69.pinout.json", "debugBoardType": 3, "description": "FTDI-LITE SDX95 M.2", "name": "SDX95 M.2", "platform_id": 69, "revision": 23, "usb_descriptor": "ALPACA-LITE SDX95 M.2" }, { "chip1BusSet": 12, "chip2BusSet": 0, "chip3BusSet": 0, "chip4BusSet": 0, "configPath": "TAC_FTDI_70.pinout.json", "debugBoardType": 3, "description": "ALPACA-LITE HAWI CDP", "name": "Hawi CDP", "platform_id": 70, "revision": 15, "usb_descriptor": "ALPACA-LITE HAWI CDP" }, { "chip1BusSet": 12, "chip2BusSet": 0, "chip3BusSet": 0, "chip4BusSet": 0, "configPath": "TAC_FTDI_71.pinout.json", "debugBoardType": 3, "description": "FTDI TAC for RB4 IQ-8275-EVK", "name": "RB4 IQ-8275-EVK", "platform_id": 71, "revision": 30, "usb_descriptor": "ALPACA-LITE FOR RB4 IQ-8275-EVK" }, { "chip1BusSet": 12, "chip2BusSet": 0, "chip3BusSet": 0, "chip4BusSet": 0, "configPath": "TAC_FTDI_72.pinout.json", "debugBoardType": 3, "description": "JTAG MUX DC", "name": "AmboseliAQ JTAG MUX DC", "platform_id": 72, "revision": 31, "usb_descriptor": "TDP535_JTAG_MUX_DC" }, { "chip1BusSet": 12, "chip2BusSet": 0, "chip3BusSet": 0, "chip4BusSet": 0, "configPath": "TAC_FTDI_73.pinout.json", "debugBoardType": 3, "description": "MTP8950 (Maili) FTDI IO", "name": "Maili MTP8950", "platform_id": 73, "revision": 28, "usb_descriptor": "ALPACA-LITE MTP8950" }, { "configPath": "TAC_PSOC_74.pinout.json", "debugBoardType": 2, "description": "30-P9415-2 Dongle for Aliso", "name": "Aliso CDP", "platform_id": 74, "revision": 53, "usb_descriptor": "" }, { "chip1BusSet": 12, "chip2BusSet": 0, "chip3BusSet": 0, "chip4BusSet": 0, "configPath": "TAC_FTDI_77.pinout.json", "debugBoardType": 3, "description": "ALPACA-LITE KARNALI QCB DT", "name": "KARNALI QCB DT", "platform_id": 77, "revision": 84, "usb_descriptor": "ALPACA-LITE KARNALI QCB DT" }, { "chip1BusSet": 12, "chip2BusSet": 0, "chip3BusSet": 0, "chip4BusSet": 0, "configPath": "TAC_FTDI_78.pinout.json", "debugBoardType": 3, "description": "ALPACA-LITE MAILI CDP", "name": "Maili CDP8950", "platform_id": 78, "revision": 17, "usb_descriptor": "ALPACA-LITE MAILI CDP" }, { "configPath": "TAC_PIC32CXAuto_81.pinout.json", "debugBoardType": 4, "description": "Seca CoB STAR", "name": "Seca CoB STAR", "platform_id": 81, "revision": 2, "usb_descriptor": "TORO" }, { "configPath": "TAC_PSOC_82.pinout.json", "debugBoardType": 2, "description": "SHIKRA PSOC", "name": "SHIKRA PSOC", "platform_id": 82, "revision": 38, "usb_descriptor": "" }, { "configPath": "TAC_PIC32CXAuto_85.pinout.json", "debugBoardType": 4, "description": "IQ10 RRD V1", "name": "IQ10 RRD V1", "platform_id": 85, "revision": 1, "usb_descriptor": "IQ10rrd" }, { "configPath": "TAC_PSOC_87.pinout.json", "debugBoardType": 2, "description": "HAWI QRD PSOC", "name": "HAWI QRD", "platform_id": 87, "revision": 7, "usb_descriptor": "" } ], "modification_date": "Wed Oct 7 01:49:31 2026" } pytactl-3.2/pytactl/tacconfig.py000066400000000000000000000604661526550266300170530ustar00rootroot00000000000000# Copyright (c) 2026 Qualcomm Technologies, Inc. and/or its subsidiaries. # SPDX-License-Identifier: BSD-3-Clause """Conversion between TAC configuration formats. Upstream qcom-test-automation-controller historically stored one combined ``.tcnf`` file per debug board: hardware pinout, automation script and Qt UI layout (tabs, buttons, labels, tooltips, grid cells) in a single JSON object. `PR #54 `_ splits that into two sibling files: * ``TAC__.pinout.json`` - the *shared* hardware description: pins, bus map, script variables and the Alpaca script. Self-describing (``format == "tac-pinout"``), schema ``https://qualcomm.github.io/tac/schemas/pinout-1.0.json``. * ``TAC__.tcnf`` - a slim UI overlay that points back at its pinout file through ``pinout_ref`` and carries only UI concerns. pytactl drives hardware and has no UI, so it wants the pinout half and nothing else. This module is the Python port of the upstream split (see ``PlatformConfiguration::splitConfiguration``/``mergeConfiguration`` and the ``TACConfigSplit`` utility added by that PR), so pytactl can convert the configs itself instead of waiting for the split to land upstream, and can consume upstream's ``*.pinout.json`` files unchanged once it does. The one place the conversion is deliberately more than a mechanical split is `drop_shadowed_pins`: ``enabled`` is a UI field and does not survive into the pinout file, but pytactl needs it, so the decision it used to drive at load time is baked into the converted pinout instead. See that function for details. """ import glob import json import logging import os import re import subprocess logger = logging.getLogger() # Self-describing envelope of the shared pinout file. Consumers key off # "format" before parsing anything else. PINOUT_FORMAT = "tac-pinout" PINOUT_SCHEMA_VERSION = "1.0" PINOUT_SCHEMA_URL = "https://qualcomm.github.io/tac/schemas/pinout-1.0.json" PINOUT_EXTENSION = ".pinout.json" # Provenance of an imported config: which upstream repository, revision and file # it was converted from. pytactl's own addition - upstream's pinout schema sets # "additionalProperties": false, so an annotated config no longer validates # against it. That is a deliberate trade for traceability of the vendored set: # every config carries the qcom-test-automation-controller commit it came from, # so a file stays traceable even away from the directory it was imported into. SOURCE_FIELD = "source" # Link from the UI overlay to its pinout file, and the per-pin key the overlay # uses to join back to a hardware pin. PINOUT_REF = "pinout_ref" PIN_REF = "ref" # Fields that identify a physical pin. Written flat into the pinout file and # inside the overlay's "ref" object. FTDI uses all three, PSOC/PIC32CX only # pin_number. PIN_KEY_FIELDS = ("chip_index", "bus", "pin_number") # Per-pin hardware fields -> pinout file. Any pin field that is neither a key # field nor a hardware field (enabled, name, help_hint, group/tab_name, # command_group, run_priority, and any future UI field) goes to the overlay. PIN_HARDWARE_FIELDS = ( "command", "input", "inverted", "initial_value", "priority", "initialization_priority", "classic_action", ) # Top-level keys that belong only to the shared pinout file. PINOUT_ONLY_FIELDS = ( "usb_descriptor", "reset_enabled", "script", "chip_count", "bus", "supportedFirmwareVer", ) # Top-level identity keys duplicated into both files (the overlay stays # authoritative when a config is edited in the QTAC configuration editor). IDENTITY_FIELDS = ("name", "description", "platform_type", "platform_id") # Keys that straddle both files and so are handled separately from the # top-level field partition above. _SPLIT_ARRAYS = ("pins", "variables") # Envelope keys, which exist only in the pinout file and are dropped on merge. # The provenance annotation counts as one: it describes the file, not the board. _ENVELOPE_FIELDS = ("$schema", "format", "schema_version", SOURCE_FIELD) class ConfigFormatError(Exception): """Raised for a config file that is not in any format we understand.""" def is_pinout(config): """True when ``config`` is a parsed shared pinout file.""" return isinstance(config, dict) and config.get("format") == PINOUT_FORMAT def is_overlay(config): """True when ``config`` is a parsed UI overlay referencing a pinout file.""" return isinstance(config, dict) and PINOUT_REF in config def pinout_filename_for(filename): """Return the pinout file name for a config file name. ``TAC_FTDI_15.tcnf`` -> ``TAC_FTDI_15.pinout.json``. A name that already ends in ``.pinout.json`` is returned unchanged, so the mapping is idempotent. """ name = os.path.basename(filename) if name.endswith(PINOUT_EXTENSION): return name base, _, extension = name.rpartition(".") # rpartition returns ("", "", name) when there is no dot at all. return (base or extension) + PINOUT_EXTENSION def pin_key(key_holder): """Stable identity of a physical pin, built from the key fields present. ``key_holder`` is either a pin from a pinout file (key fields written flat) or the ``ref`` object of an overlay pin. Values are compared as strings because ``pin_number`` is a string for FTDI/PSOC and an integer for PIC32CX. """ return tuple( str(key_holder[field]) for field in PIN_KEY_FIELDS if field in key_holder ) def normalize_script_indentation(script): """Indent every statement in an Alpaca script with a single tab. TAC config scripts are written with tabs: a ``def`` at column 0 and its body one tab in. A handful of upstream configs indent the odd line with spaces instead (TAC_FTDI_51, TAC_FTDI_52 and TAC_FTDI_77 each have two), which the parser rejects - see ``Board.parse_script``, which requires tabs rather than quietly accepting either. Conversion is the import boundary, so that is where the indentation is made canonical. Blank lines are left alone; they are not statements. Returns ``(script, lines_changed)``. """ if not script: return script, 0 changed = 0 def to_tab(match): nonlocal changed if match.group(0) != "\t": changed += 1 return "\t" # Leading whitespace of a line with content, without touching the line # ending: configs use both LF and CRLF and the parser reads both. normalized = re.sub(r"^[ \t]+(?=\S)", to_tab, script, flags=re.MULTILINE) return normalized, changed def git_source_info(directory): """Describe ``directory`` as a path inside a git checkout, or ``None``. Returns ``{"repository": ..., "commit": ..., "path": ...}`` where ``path`` is ``directory`` relative to the top of the work tree. Used to annotate converted configs with the upstream revision they came from, so that re-running the conversion against a newer checkout re-stamps them. ``None`` when ``directory`` is not in a git checkout, when git is not installed, or when the checkout has no commit yet - provenance is recorded only when it is actually known. """ def git(*args): try: result = subprocess.run( ["git", "-C", directory, *args], capture_output=True, text=True, timeout=30, ) except (OSError, subprocess.SubprocessError) as error: logger.debug("git %s failed in %s: %s", args[0], directory, error) return None if result.returncode != 0: return None return result.stdout.strip() or None toplevel = git("rev-parse", "--show-toplevel") commit = git("rev-parse", "HEAD") if not toplevel or not commit: return None source = {} remote = git("remote", "get-url", "origin") if remote: source["repository"] = remote source["commit"] = commit path = os.path.relpath(os.path.abspath(directory), toplevel) if path != ".": source["path"] = path.replace(os.sep, "/") return source def annotate_source(pinout, source, filename=None): """Return ``pinout`` with a `SOURCE_FIELD` recording where it came from. ``source`` is the repository-level provenance (see `git_source_info`); ``filename`` names the upstream config file this pinout was converted from. The annotation is placed straight after the envelope so it is visible at the top of the file, and replaces any annotation already there. """ annotated = {} for key in ("$schema", "format", "schema_version"): if key in pinout: annotated[key] = pinout[key] entry = dict(source) if filename: entry["file"] = filename annotated[SOURCE_FIELD] = entry for key, value in pinout.items(): if key not in annotated: annotated[key] = value return annotated def split_configuration(combined, pinout_ref=None): """Split a combined config into ``(pinout, overlay)``. Faithful port of upstream ``PlatformConfiguration::splitConfiguration``: identity fields are duplicated, hardware fields go to the pinout, and everything else - including any field this port has never heard of - lands in the UI overlay, so nothing is silently dropped. ``pinout_ref``, when given, is written into the overlay as the link back to its pinout file (upstream sets this while saving, not while splitting). """ pinout = { "$schema": PINOUT_SCHEMA_URL, "format": PINOUT_FORMAT, "schema_version": PINOUT_SCHEMA_VERSION, } overlay = {} for key, value in combined.items(): if key in _SPLIT_ARRAYS: continue if key in IDENTITY_FIELDS: pinout[key] = value overlay[key] = value elif key in PINOUT_ONLY_FIELDS: pinout[key] = value else: overlay[key] = value pinout_pins = [] overlay_pins = [] for pin in combined.get("pins", []): hardware_pin = {} ui_pin = {} ref = {} for key, value in pin.items(): if key in PIN_KEY_FIELDS: hardware_pin[key] = value ref[key] = value elif key in PIN_HARDWARE_FIELDS: hardware_pin[key] = value else: ui_pin[key] = value ui_pin[PIN_REF] = ref pinout_pins.append(hardware_pin) overlay_pins.append(ui_pin) pinout["pins"] = pinout_pins overlay["pins"] = overlay_pins # Variable defaults travel with the hardware (the script substitutes them); # label/tooltip/type/layout stay in the overlay. Joined back on "name". pinout_variables = [] overlay_variables = [] for variable in combined.get("variables", []): hardware_variable = {} ui_variable = {} for key, value in variable.items(): if key == "name": hardware_variable[key] = value ui_variable[key] = value elif key == "default_value": hardware_variable[key] = value else: ui_variable[key] = value pinout_variables.append(hardware_variable) overlay_variables.append(ui_variable) pinout["variables"] = pinout_variables overlay["variables"] = overlay_variables if pinout_ref: overlay[PINOUT_REF] = pinout_ref return pinout, overlay def merge_configuration(pinout, overlay): """Rebuild a combined config from a pinout file and its UI overlay. Inverse of `split_configuration`, ported from upstream ``PlatformConfiguration::mergeConfiguration``. The overlay wins on the identity fields both files carry. """ combined = { key: value for key, value in overlay.items() if key not in _SPLIT_ARRAYS and key != PINOUT_REF } for key, value in pinout.items(): if key in _SPLIT_ARRAYS or key in _ENVELOPE_FIELDS: continue combined.setdefault(key, value) ui_pins = {pin_key(pin.get(PIN_REF, {})): pin for pin in overlay.get("pins", [])} combined_pins = [] for hardware_pin in pinout.get("pins", []): pin = dict(hardware_pin) ui_pin = ui_pins.get(pin_key(hardware_pin)) if ui_pin: pin.update({k: v for k, v in ui_pin.items() if k != PIN_REF}) combined_pins.append(pin) combined["pins"] = combined_pins ui_variables = { variable.get("name"): variable for variable in overlay.get("variables", []) } combined_variables = [] for hardware_variable in pinout.get("variables", []): variable = dict(hardware_variable) ui_variable = ui_variables.get(hardware_variable.get("name")) if ui_variable: variable.update(ui_variable) combined_variables.append(variable) combined["variables"] = combined_variables return combined def shadowed_pin_keys(pins): """Keys of pins that a same-named enabled pin takes precedence over. ``enabled`` is a UI field: it says whether the QTAC app shows a control for a pin. It does not survive into the shared pinout file, but pytactl needs the distinction, because several configs wire the same command name to two physical pins and disable one of them (e.g. ``pshold`` in TAC_FTDI_63, ``msmreset`` in TAC_PSOC_66). pytactl binds a command to a pin by ``setattr``, so without the flag the *last* pin listed would win, silently driving the wrong physical line. A disabled pin is only shadowed when its command actually collides with an enabled pin; a disabled pin with a command of its own is kept, matching the behaviour pytactl applied at load time before the split. """ enabled_commands = {pin.get("command") for pin in pins if pin.get("enabled", True)} return { pin_key(pin) for pin in pins if not pin.get("enabled", True) and pin.get("command") in enabled_commands } def convert_configuration(combined): """Convert one combined config into the shared pinout config pytactl loads. This is `split_configuration` plus the `shadowed_pin_keys` resolution; the UI overlay is discarded. Returns the pinout dict. """ pins = combined.get("pins", []) shadowed = shadowed_pin_keys(pins) pinout, _ = split_configuration(combined) if shadowed: logger.debug( "Dropping %d pin(s) shadowed by an enabled pin with the same command", len(shadowed), ) pinout["pins"] = [pin for pin in pinout["pins"] if pin_key(pin) not in shadowed] return pinout def convert_file(path): """Load any TAC config file and return it as a pinout config. Accepts all three shapes pytactl can be pointed at: * a shared ``*.pinout.json`` - returned as-is; * a split ``*.tcnf`` UI overlay - its ``pinout_ref`` sibling is loaded from the same directory and merged, so the overlay's pin enablement is applied; * a legacy combined ``*.tcnf`` - converted in memory. Raises `ConfigFormatError` if the file is none of these. """ with open(path) as handle: config = json.load(handle) if is_pinout(config): return config if is_overlay(config): pinout_path = os.path.join( os.path.dirname(path), os.path.basename(config[PINOUT_REF]) ) with open(pinout_path) as handle: pinout = json.load(handle) if not is_pinout(pinout): raise ConfigFormatError( f"{pinout_path} is referenced as a pinout file but its " f"'format' is not {PINOUT_FORMAT!r}" ) converted = convert_configuration(merge_configuration(pinout, config)) # The merge drops the annotation along with the rest of the envelope; # the file it describes is the same one, so put it back. if SOURCE_FIELD in pinout: converted = annotate_source(converted, pinout[SOURCE_FIELD]) return converted if "pins" not in config: raise ConfigFormatError(f"{path} is not a TAC configuration file") return convert_configuration(config) def rewrite_device_list(device_list, default_filename): """Point every catalog entry at the converted pinout file. Upstream ``devicelist.json`` entries carry repository-relative paths (``../../configurations/TAC_FTDI_15.tcnf``), and leave ``configPath`` empty for boards that rely on the generated default FTDI config. Every config is installed flat into one directory, so entries are reduced to the bare pinout file name, and empty ones point at ``default_filename``. Mutates ``device_list`` in place and returns the number of entries changed. """ patched = 0 for entry in device_list.get("catalog", []): config_path = entry.get("configPath") new_path = pinout_filename_for(config_path) if config_path else default_filename if new_path != config_path: entry["configPath"] = new_path patched += 1 return patched def _write_json(path, obj): with open(path, "w") as handle: json.dump(obj, handle, indent=4) handle.write("\n") def convert_directory( source, destination=None, default_filename=None, write_overlay=False, dry_run=False, source_info=None, annotate=True, ): """Convert every TAC config in ``source`` into ``destination``. Script indentation is normalised to tabs on the way through, so that what is written out is what `Board.parse_script` requires. Each ``*.tcnf`` (legacy or already split) becomes a ``*.pinout.json``. ``*.pinout.json`` files that have no ``*.tcnf`` beside them are converted too, so a directory of upstream pinout files can be installed directly. A ``devicelist.json`` in ``source`` is copied over with its ``configPath`` entries rewritten to the converted file names. With ``write_overlay`` the slim UI overlay is written alongside each pinout file, giving the complete two-file layout rather than just the half pytactl needs. With ``dry_run`` nothing is written. Each converted config is annotated with the upstream repository, revision and file it came from (see `annotate_source`). ``source_info`` supplies that provenance and always wins; when it is omitted and ``source`` is a git checkout, provenance is read from the checkout and applied only to configs that do not already carry an annotation - so re-converting an imported set in place does not restamp it with the wrong repository. Pass ``annotate=False`` to write configs that carry no annotation and so validate against upstream's pinout schema unchanged; a config that is already annotated then keeps the annotation it has. Returns a ``{"converted": [...], "failed": [(name, error), ...], "device_list": bool}`` summary. """ destination = destination or source default_filename = default_filename or ("default" + PINOUT_EXTENSION) # Provenance the caller states is authoritative; provenance merely observed # from the source directory is not, and defers to any already recorded. stated_source = source_info is not None if annotate and source_info is None: source_info = git_source_info(source) if source_info is None: logger.debug( "%s is not a git checkout; converting without provenance", source ) if not dry_run: os.makedirs(destination, exist_ok=True) converted = [] failed = [] sources = sorted(glob.glob(os.path.join(source, "*.tcnf"))) # Pinout files whose overlay is missing (or that were never split at all) # are not reachable through a .tcnf, so pick them up directly. covered = {pinout_filename_for(path) for path in sources} sources += [ path for path in sorted(glob.glob(os.path.join(source, "*" + PINOUT_EXTENSION))) if os.path.basename(path) not in covered ] for path in sources: name = os.path.basename(path) pinout_name = pinout_filename_for(name) try: with open(path) as handle: config = json.load(handle) if is_pinout(config): pinout, overlay = config, None elif is_overlay(config): pinout = convert_file(path) overlay = None else: pinout, overlay = split_configuration(config, pinout_ref=pinout_name) shadowed = shadowed_pin_keys(config.get("pins", [])) if shadowed: pinout["pins"] = [ pin for pin in pinout["pins"] if pin_key(pin) not in shadowed ] overlay["pins"] = [ pin for pin in overlay["pins"] if pin_key(pin.get(PIN_REF, {})) not in shadowed ] except (OSError, ValueError, ConfigFormatError) as error: logger.error("Failed to convert %s: %s", name, error) failed.append((name, str(error))) continue script, retabbed = normalize_script_indentation(pinout.get("script", "")) if retabbed: logger.info("%s: re-indented %d script line(s) with tabs", name, retabbed) pinout["script"] = script if annotate and source_info and (stated_source or SOURCE_FIELD not in pinout): pinout = annotate_source(pinout, source_info, name) if not dry_run: _write_json(os.path.join(destination, pinout_name), pinout) if write_overlay and overlay is not None: _write_json(os.path.join(destination, name), overlay) logger.debug("Converted %s -> %s", name, pinout_name) converted.append(pinout_name) device_list_path = os.path.join(source, "devicelist.json") has_device_list = os.path.isfile(device_list_path) if has_device_list: with open(device_list_path) as handle: device_list = json.load(handle) patched = rewrite_device_list(device_list, default_filename) logger.debug("Rewrote %d configPath entries in devicelist.json", patched) if not dry_run: _write_json(os.path.join(destination, "devicelist.json"), device_list) return { "converted": converted, "failed": failed, "device_list": has_device_list, } def list_directory(tac_config_path): """Describe the config set in ``tac_config_path`` as pytactl would load it. Every ``devicelist.json`` catalog entry is resolved to its config file the way the board classes do it (by bare file name inside the directory) and that file is loaded with `convert_file`. Config scripts are not parsed: a script error surfaces when a board is created from the config, and is not a sign the config set is missing. Returns ``{"entries": [...], "unreferenced": [...]}``. Each entry is the catalog entry's ``name``, ``platform_id``, ``usb_descriptor`` and ``configPath``, plus ``status`` (``"ok"``, ``"missing"`` or ``"invalid"``) and, unless the config loaded, ``error``. ``unreferenced`` names the ``*.pinout.json`` files no catalog entry points at. Raises `OSError` or `ValueError` if ``devicelist.json`` cannot be read. """ with open(os.path.join(tac_config_path, "devicelist.json")) as handle: device_list = json.load(handle) entries = [] referenced = set() for entry in device_list.get("catalog", []): config_name = os.path.basename(entry.get("configPath") or "") info = { "name": entry.get("name", ""), "platform_id": entry.get("platform_id"), "usb_descriptor": entry.get("usb_descriptor", ""), "configPath": config_name, "status": "ok", } config_path = os.path.join(tac_config_path, config_name) if not config_name or not os.path.isfile(config_path): info["status"] = "missing" info["error"] = "no configPath" if not config_name else "file not found" else: referenced.add(config_name) try: convert_file(config_path) except (OSError, ValueError, ConfigFormatError) as error: info["status"] = "invalid" info["error"] = str(error) entries.append(info) unreferenced = sorted( name for name in os.listdir(tac_config_path) if name.endswith(PINOUT_EXTENSION) and name not in referenced ) return {"entries": entries, "unreferenced": unreferenced} pytactl-3.2/scripts/000077500000000000000000000000001526550266300145375ustar00rootroot00000000000000pytactl-3.2/scripts/known-config-differences.json000066400000000000000000000033141526550266300223050ustar00rootroot00000000000000{ "description": "Upstream TAC config changes deliberately not taken into pytactl/tac_configs/. Maintained by scripts/sync_upstream_configs.py; see its docstring. An entry suppresses the upstream-config-sync pull request only while upstream still matches its fingerprint.", "differences": { "TAC_FTDI_16.pinout.json": { "note": "Upstream d313724 and 665b842 drop the bootToEDL, bootToEUD, bootToUEFIMenu and bootToFastBoot sequences and add USB disconnect to the power sequences. The shortened usb_descriptor is taken.", "fingerprint": "sha256:96abe032a859e181129fe2258b7056d48a90a0fdea2606b146fd504dccbd1c3f", "upstream_commit": "954c804e694e8b7d7e8fc71c105d66c3f4742d20" }, "TAC_FTDI_49.pinout.json": { "note": "Upstream 7f524c2 converts the script's CRLF line endings to LF.", "fingerprint": "sha256:a9aa06107d7debbc51f00d24c40d6530328b3ff316c2c4aece2abb605ac8de5a", "upstream_commit": "03cddde77c5c72ef2b0753683e8ad4f8fc5ce6f8" }, "TAC_PSOC_35.pinout.json": { "note": "pytactl 8f2c5eb shortens powerDelay from 18000 to 2000 ms; the upstream value makes RB1 reboot after it has started booting.", "fingerprint": "sha256:e1d03cd8f5b7d0b53f94c58013bfebd63af11800dae1d988da3b1a783d5f400a", "upstream_commit": "03cddde77c5c72ef2b0753683e8ad4f8fc5ce6f8" }, "TAC_PSOC_82.pinout.json": { "note": "Upstream 98aa34e adds firmware version 19 to supportedFirmwareVer.", "fingerprint": "sha256:feb877c76490f7088133f9cd04f02e46f24271fea728fd44fb502a4b0bc4ea5f", "upstream_commit": "03cddde77c5c72ef2b0753683e8ad4f8fc5ce6f8" } } } pytactl-3.2/scripts/sync_upstream_configs.py000066400000000000000000000432041526550266300215200ustar00rootroot00000000000000# Copyright (c) 2026 Qualcomm Technologies, Inc. and/or its subsidiaries. # SPDX-License-Identifier: BSD-3-Clause """Compare the vendored TAC configs with upstream and sync what changed. Converts the configs in a qcom-test-automation-controller checkout to the shared pinout format (the same conversion "pytactl convertconfigs" runs) and compares the result, file by file, with the set vendored in pytactl/tac_configs/. A file that differs is either *known* or *new*. Known differences are upstream changes deliberately not taken into pytactl; they are listed in scripts/known-config-differences.json, each with a fingerprint of the upstream content it was reviewed against. A difference is new when the file is not listed there, or when upstream has changed it again since, so that its fingerprint no longer matches. With --apply, new differences are written into the vendored set (each file stamped with the upstream commit it now comes from) and known ones are left alone. Entries in the known-differences file that no longer describe a difference are dropped. Nothing else is touched, so a run with nothing new leaves the tree clean - which is what the upstream-config-sync workflow relies on to decide whether to open a pull request. With --update-known, every current difference is recorded as known instead: the way to accept a difference as one to keep out of pytactl. The upstream device catalog (devicelist.json) is compared without the entries whose config the vendored set will not have once the sync is done - configs held back as known differences, for one - so that taking a catalog change never leaves entries pointing at configs pytactl does not ship. BugHopper boards (V1 and V2) are driven by pytactl's own code rather than by a TAC config, so upstream changes relating to them are never taken: configs for a BugHopper board, on either side, are not compared, and BugHopper entries are dropped from the upstream device catalog before it is compared. An upstream config that cannot be converted is taken as removed, but reported as a conversion failure, with the converter's error, in the output and in the pull request summary. The provenance annotation ("source") is excluded from the comparison: it names the upstream commit, which moves with every upstream push, config change or not. """ import argparse import hashlib import json import os import subprocess import sys import tempfile REPO_ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) sys.path.insert(0, REPO_ROOT) from pytactl import BUNDLED_DEFAULT_CONFIG_FILENAME, tacconfig # noqa: E402 UPSTREAM_REPOSITORY = "https://github.com/qualcomm/qcom-test-automation-controller.git" UPSTREAM_CONFIG_PATH = "configurations" DEVICE_LIST = "devicelist.json" DEFAULT_CONFIGS = os.path.join(REPO_ROOT, "pytactl", "tac_configs") DEFAULT_KNOWN = os.path.join(REPO_ROOT, "scripts", "known-config-differences.json") # Vendored files with no upstream counterpart: the FTDI Alpaca-Lite default is # generated by QTAC code rather than stored as a config upstream. LOCAL_ONLY = {BUNDLED_DEFAULT_CONFIG_FILENAME} # Marker in the name, description or USB descriptor of a BugHopper config or # catalog entry. BUGHOPPER = "bughopper" # Fingerprint of a file upstream no longer has. REMOVED = "removed" # Fingerprint of a file upstream has but that could not be converted. It is # taken as a removal, but kept apart from one, so that a known difference # recorded for it resurfaces once upstream fixes or really removes the file. CONVERSION_FAILED = "conversion-failed" def load_json(path): with open(path) as handle: return json.load(handle) def write_json(path, obj): with open(path, "w") as handle: json.dump(obj, handle, indent=4) handle.write("\n") def comparable(config): """``config`` without its provenance annotation.""" return {k: v for k, v in config.items() if k != tacconfig.SOURCE_FIELD} def fingerprint(config, error=None): """Stable hash of a converted upstream config, provenance excluded. ``error`` is set when upstream has the file but it could not be converted. """ if error: return CONVERSION_FAILED if config is None: return REMOVED canonical = json.dumps(comparable(config), sort_keys=True, separators=(",", ":")) return "sha256:" + hashlib.sha256(canonical.encode()).hexdigest() def config_names(directory): return { name for name in os.listdir(directory) if name.endswith(tacconfig.PINOUT_EXTENSION) or name == DEVICE_LIST } def upstream_commit(checkout): return subprocess.run( ["git", "-C", checkout, "rev-parse", "HEAD"], capture_output=True, text=True, check=True, ).stdout.strip() def convert_upstream(checkout, destination, commit, repository): """Convert the upstream configs into ``destination``, and return ``{pinout name: error}`` for those that could not be converted.""" source = os.path.join(checkout, UPSTREAM_CONFIG_PATH) result = tacconfig.convert_directory( source, destination, default_filename=BUNDLED_DEFAULT_CONFIG_FILENAME, source_info={ "repository": repository, "commit": commit, "path": UPSTREAM_CONFIG_PATH, }, ) failed = {} for name, error in result["failed"]: print(f"warning: {name} could not be converted: {error}", file=sys.stderr) failed[tacconfig.pinout_filename_for(name)] = error return failed def compare(configs, converted, names=None): """Return ``{name: (vendored, upstream)}`` for every file that differs. Either side is ``None`` when the file exists only on the other. ``names`` limits the comparison to those files. """ if names is None: names = (config_names(configs) | config_names(converted)) - LOCAL_ONLY differences = {} for name in sorted(names): vendored_path = os.path.join(configs, name) upstream_path = os.path.join(converted, name) vendored = load_json(vendored_path) if os.path.exists(vendored_path) else None upstream = load_json(upstream_path) if os.path.exists(upstream_path) else None if ( vendored is None or upstream is None or comparable(vendored) != comparable(upstream) ): differences[name] = (vendored, upstream) return differences def is_bughopper(config): """Whether a config or catalog entry describes a BugHopper board.""" return config is not None and any( BUGHOPPER in str(config.get(field, "")).lower() for field in ("name", "description", "usb_descriptor") ) def drop_bughopper_catalog_entries(converted): """Remove the BugHopper entries from the converted devicelist.json, and return their names.""" path = os.path.join(converted, DEVICE_LIST) if not os.path.exists(path): return [] device_list = load_json(path) catalog = device_list.get("catalog", []) kept = [entry for entry in catalog if not is_bughopper(entry)] if len(kept) == len(catalog): return [] device_list["catalog"] = kept write_json(path, device_list) return sorted({entry.get("name") for entry in catalog if is_bughopper(entry)}) def is_known(entry, upstream, error=None): """Whether a known-differences ``entry`` still matches ``upstream``.""" return bool(entry) and entry.get("fingerprint") == fingerprint(upstream, error) def configs_after_sync(configs, converted, applied): """Names of the configs the vendored set has once ``applied`` are taken.""" names = { name for name in os.listdir(configs) if name.endswith(tacconfig.PINOUT_EXTENSION) } for name in applied: if os.path.exists(os.path.join(converted, name)): names.add(name) else: names.discard(name) return names def drop_unvendored_catalog_entries(converted, available): """Remove the catalog entries of the converted devicelist.json whose config is not in ``available``, and return those configs' names.""" path = os.path.join(converted, DEVICE_LIST) if not os.path.exists(path): return [] device_list = load_json(path) catalog = device_list.get("catalog", []) kept = [entry for entry in catalog if entry.get("configPath") in available] if len(kept) == len(catalog): return [] device_list["catalog"] = kept write_json(path, device_list) return sorted({entry.get("configPath") for entry in catalog if entry not in kept}) def describe(vendored, upstream, error=None): if vendored is None: return "new upstream file" if error: return f"could not be converted upstream ({error})" if upstream is None: return "removed upstream" fields = sorted( key for key in set(comparable(vendored)) | set(comparable(upstream)) if vendored.get(key) != upstream.get(key) ) return "changed: " + ", ".join(f"`{field}`" for field in fields) def dangling_catalog_entries(configs): """configPath values in the vendored devicelist.json with no config file.""" path = os.path.join(configs, DEVICE_LIST) if not os.path.exists(path): return [] return sorted( { entry.get("configPath") for entry in load_json(path).get("catalog", []) if not os.path.exists(os.path.join(configs, entry.get("configPath", ""))) } ) def write_summary( path, commit, repository, new, known, stale, left_out, bughopper_configs, bughopper_entries, dangling, failed, known_path, ): web = repository.removesuffix(".git") lines = [ "Sync of the vendored TAC configs in `pytactl/tac_configs/` with " f"[qcom-test-automation-controller]({web}) at " f"[`{commit[:12]}`]({web}/commit/{commit}).", "", ] if failed: lines += [ "## Warning: upstream configs that could not be converted", "", "A vendored copy of any of these is taken as removed; check that " "it should not be kept instead:", "", ] lines += [f"- `{name}`: {error}" for name, error in failed.items()] lines.append("") lines += [ "## New upstream differences (applied)", "", ] for name, (detail, was_known) in new.items(): suffix = ( " - **was a known difference**, but upstream has changed it again; " "the upstream file is taken in full" if was_known else "" ) lines.append(f"- `{name}`: {detail}{suffix}") if not new: lines.append("- none") lines += ["", "## Known differences (not applied)", ""] lines += [f"- `{name}`: {detail}" for name, detail in known.items()] or ["- none"] if stale: lines += [ "", "## Known-difference entries dropped", "", "These no longer differ from upstream:", "", ] lines += [f"- `{name}`" for name in stale] if left_out: lines += [ "", "## Catalog entries left out", "", "Upstream `devicelist.json` lists these configs, which are not " "vendored, so their entries are not taken:", "", ] lines += [f"- `{name}`" for name in left_out] if bughopper_configs or bughopper_entries: lines += [ "", "## BugHopper differences left out", "", "pytactl does not take upstream changes for BugHopper boards:", "", ] lines += [f"- `{name}`" for name in bughopper_configs] lines += [f"- `{DEVICE_LIST}` entry: {name}" for name in bughopper_entries] if dangling: lines += [ "", "## Warning: devicelist.json points at configs not vendored", "", ] lines += [f"- `{name}`" for name in dangling] lines += [ "", "The bundled-config tests will fail until that is resolved.", ] relative_known = os.path.relpath(known_path, REPO_ROOT) lines += [ "", "To keep a difference out of pytactl instead, revert that file in this " f"branch and run `python scripts/sync_upstream_configs.py " f"--update-known` to record it in `{relative_known}`.", ] with open(path, "w") as handle: handle.write("\n".join(lines) + "\n") def main(): parser = argparse.ArgumentParser(description=__doc__.split("\n\n")[0]) parser.add_argument("checkout", help="qcom-test-automation-controller git checkout") parser.add_argument( "--configs", default=DEFAULT_CONFIGS, help="vendored config directory" ) parser.add_argument("--known", default=DEFAULT_KNOWN, help="known-differences file") parser.add_argument( "--repository", default=UPSTREAM_REPOSITORY, help="repository URL recorded in the configs' provenance", ) action = parser.add_mutually_exclusive_group() action.add_argument( "--apply", action="store_true", help="write new differences into the vendored set", ) action.add_argument( "--update-known", action="store_true", help="record every current difference as known", ) parser.add_argument("--summary", help="write a Markdown summary to this file") args = parser.parse_args() commit = upstream_commit(args.checkout) known_file = ( load_json(args.known) if os.path.exists(args.known) else {"differences": {}} ) known_entries = known_file.setdefault("differences", {}) with tempfile.TemporaryDirectory(prefix="pytactl-upstream-") as converted: failed = convert_upstream(args.checkout, converted, commit, args.repository) differences = compare(args.configs, converted) differences.pop(DEVICE_LIST, None) bughopper_configs = [ name for name, sides in differences.items() if any(is_bughopper(side) for side in sides) ] for name in bughopper_configs: del differences[name] bughopper_entries = drop_bughopper_catalog_entries(converted) # The catalog is compared as it would be taken: without the entries # for configs the vendored set will not have. With --update-known no # config is taken. applied = ( [] if args.update_known else [ name for name, (_, upstream) in differences.items() if not is_known(known_entries.get(name), upstream, failed.get(name)) ] ) left_out = drop_unvendored_catalog_entries( converted, configs_after_sync(args.configs, converted, applied) ) differences.update(compare(args.configs, converted, {DEVICE_LIST})) differences = dict(sorted(differences.items())) new = {} known = {} for name, (vendored, upstream) in differences.items(): detail = describe(vendored, upstream, failed.get(name)) entry = known_entries.get(name) if is_known(entry, upstream, failed.get(name)): known[name] = detail else: new[name] = (detail, entry is not None) stale = sorted(set(known_entries) - set(differences)) print(f"Upstream {args.repository} at {commit}") for name, detail in known.items(): print(f"known {name}: {detail}") for name, (detail, was_known) in new.items(): note = " (known difference changed upstream)" if was_known else "" print(f"NEW {name}: {detail}{note}") for name in stale: print(f"stale {name}: listed as known but no longer differs") for name in left_out: print(f"skip {DEVICE_LIST}: catalog entry for {name}, not vendored") for name in bughopper_configs: print(f"skip {name}: BugHopper") for name in bughopper_entries: print(f"skip {DEVICE_LIST}: catalog entry for {name}, BugHopper") if args.update_known: known_file["differences"] = { name: { **known_entries.get(name, {}), "fingerprint": fingerprint(upstream, failed.get(name)), "upstream_commit": commit, } for name, (_, upstream) in differences.items() } write_json(args.known, known_file) print(f"Recorded {len(differences)} known difference(s) in {args.known}") return 0 if args.apply: for name in new: upstream_path = os.path.join(converted, name) vendored_path = os.path.join(args.configs, name) if os.path.exists(upstream_path): write_json(vendored_path, load_json(upstream_path)) else: os.remove(vendored_path) known_entries.pop(name, None) for name in stale: del known_entries[name] if new or stale: write_json(args.known, known_file) if args.summary: dangling = dangling_catalog_entries(args.configs) if args.apply else [] write_summary( args.summary, commit, args.repository, new, known, stale, left_out, bughopper_configs, bughopper_entries, dangling, failed, args.known, ) # Without --apply, a non-zero exit flags that the vendored set is behind. if not args.apply and (new or stale): return 1 return 0 if __name__ == "__main__": sys.exit(main()) pytactl-3.2/tests/000077500000000000000000000000001526550266300142125ustar00rootroot00000000000000pytactl-3.2/tests/README.md000066400000000000000000000247641526550266300155060ustar00rootroot00000000000000# pytactl test suite Tests that every config file of the TAC config set can be loaded through the same code path `pytactl.shell` and `pytactl.service` use — `Board.create_board()` — with the USB device, GPIO and serial hardware mocked, and that each board exposes the required quick methods (`powerOn`, `powerOff`, `bootToEDL`). Alongside that, `tests/test_tacconfig.py` covers the config conversion itself. The code under test lives in the `pytactl` package (`pytactl/debugboard.py` etc.), so the tests import it as `from pytactl import debugboard`. ## Configs under test The data-driven tests run over the `.pinout.json` files of a TAC config set. `tests/conftest.py` looks for one in two places, in order: 1. `$PYTACTL_TAC_CONFIG_DIR`, if set — an explicit override, for distro packagers and anyone who converts a config set somewhere of their own choosing. 2. `pytactl.PACKAGE_TAC_CONFIG_PATH` — the config set vendored in this repository under `pytactl/tac_configs/`, which is what a plain checkout tests against. The directory written by the deprecated `pytactl installconfigs` is not consulted, so a set installed on the machine never replaces the vendored one under test. So a bare `python -m pytest` in a fresh checkout runs the full suite offline, against the bundled configs. To test against current upstream instead: ```sh pytactl convertconfigs /path/to/upstream/configurations --output ~/tac-configs export PYTACTL_TAC_CONFIG_DIR=~/tac-configs ``` If neither holds a `.pinout.json` file — a distro build that strips the bundled configs, say — every config-dependent test **skips** with a reason naming both, and the remainder of the suite (imports, CLI parser, config conversion, `create_board()` dispatch for Bughopper, …) still runs — see [issue #22](https://github.com/qualcomm/pytactl/issues/22). The handful of tests that are specifically *about* the vendored set skip on their own marker, `requires_bundled_configs`, so de-vendoring is not a build failure. git is not needed either. The two tests that check how pytactl reads a git checkout (`git_source_info`) build a real one and skip on the `requires_git` marker when git is not installed; everything else about provenance annotation runs without it. ## Running ```sh . ./venv/bin/activate pip install -e ".[dev]" python -m pytest ``` The exact pass/xfail counts track the config set under test; a run against the bundled set is in the order of **284 passed, 1 skipped, 25 xfailed**. With the configs stripped, expect roughly **77 passed, 17 skipped**. ## How it works The tests are data-driven over every `*.pinout.json` file of the config set. For each config a fake USB device is constructed so that `Board.create_board()`'s vendor/product dispatch and config-by-USB-description matching select that config: - **FTDI boards** are matched by `usb_descriptor` against the USB device's `product` string. The harness writes a synthetic `devicelist.json` mapping each config to a unique descriptor and sets the fake device's `product` to match. - **PSOC boards** are matched by `platform_id`, normally read from the board over a serial console. The harness mocks `PsocBoard.__get_board_id` to return the synthetic id registered for that config. Hardware is replaced with harmless fakes (`mock_hardware` fixture): `GpioAsyncController` → `MagicMock`, `PsocPort` → in-memory fake, `sleep` → no-op (so config scripts with `delay` run instantly). ### Config-loading tests (`tests/test_config_loading.py`) | Test | Asserts | |------|---------| | `test_config_loads_via_usb_dispatch` | the config parses and builds a board | | `test_required_functions_available` | `powerOn`/`powerOff`/`bootToEDL` are present and callable | | `test_required_functions_execute` | invoking the defined functions runs the parsed script end to end | | `test_quick_method_call_wrapper` | the REST API `QuickMethod.call()` path works | | `test_ftdi_falls_back_to_default_config` | an unknown FTDI descriptor falls back to `default.pinout.json` (the bundled FTDI Alpaca-Lite config, platform_id 13) | ### Conversion tests (`tests/test_tacconfig.py`) Cover `pytactl.tacconfig`, the converter from the upstream config files to the shared pinout format: the field partition between the pinout file and the UI overlay, the merge back to a combined config, the shadowed-pin resolution that stands in for the `enabled` flag the pinout format drops, `devicelist.json` rewriting, directory conversion (in place, to an output directory, dry run, with the UI overlay, and with a broken config in the source), and that a board built from each of the three accepted config shapes binds the same pins. They also cover the provenance annotation: where it is placed, that it replaces rather than accumulates, that it is treated as envelope (so it never leaks into a merged config), that `convertconfigs` reads it from the source checkout but does not restamp an already-imported set, and that `--no-annotate` leaves it off. Finally they check the vendored config set itself: every bundled file is a valid pinout config, no `devicelist.json` entry points at a config the package does not ship, and every config names the same upstream commit — the one `pytactl/tac_configs/README.md` records, so the two cannot drift. ### Script parsing tests (`tests/test_script_parsing.py`) Cover `Board.parse_script` against small synthetic configs: a tab-indented script parses, anything else (spaces, mixed, over-indented) is rejected with the offending line numbers, CRLF line endings parse, blank lines are not held to the tab rule, script variables are substituted and an undeclared one is reported by name, and a command the script drives with no pin behind it is warned about without mistaking `delay`, `logComment` or a call to another function for one. ### Dispatch tests (`tests/test_create_board.py`) `Board.create_board()` routing: no device → `None`, FTDI, PSOC, Bughopper V1, Bughopper V2 with/without the optional `hid` module, and PIC32CX. ## Special-cased configs These are declared centrally in `tests/conftest.py`, each with a reason. All `xfail` markers are `strict=True`, so if a config is fixed it surfaces as an **XPASS**, prompting the entry to be removed. ### Excluded from the suite (`EXCLUDED_CONFIGS`) Not driven by the config-script path: | Config | Reason | |--------|--------| | `TAC_PIC32CXAuto_54.pinout.json` | PIC32CXAuto uses a dedicated dispatch path (covered by `test_create_board_dispatches_pic32cx`) | | `TAC_FTDI_80.pinout.json` | Bughopper board, handled by `BughopperV1Board`/`BughopperV2Board` | ### Expected failures (`xfail`) All of these are upstream config data problems. Each needs a value that only the board's owner can supply — which physical pin a command drives, or how long a board must be held in a state — so they are left as upstream ships them and fixes belong in [qcom-test-automation-controller](https://github.com/qualcomm/qcom-test-automation-controller). pytactl reports each of them at load time rather than failing obscurely later. **Fail to load** (`XFAIL_LOAD`): | Config | Reason | |--------|--------| | `TAC_FTDI_72.pinout.json` | script uses `$edl`/`$uefi`/`$fastboot` but the config declares no variables. Raises `ConfigScriptError` naming them; the delays are board timings only the config can supply | **Omit a required function** (`XFAIL_REQUIRED`) — load fine but don't define all three of `powerOn`/`powerOff`/`bootToEDL`: | Config | Reason | |--------|--------| | `TAC_FTDI_15.pinout.json` | defines `bootToEDL` only; no `powerOn`/`powerOff` | | `TAC_FTDI_16.pinout.json` | no `powerOn`/`powerOff` | | `TAC_FTDI_41.pinout.json` | two SoCs: `fpowerOn`/`spowerOn`, `bootToAPQEDL`/`bootToSDXEDL`. Which one a plain `powerOn` should mean is a board question | | `TAC_FTDI_42.pinout.json` | empty script (SMART LABEL board defines no functions) | | `TAC_FTDI_60.pinout.json` | defines `reset`/`bootToEDL`/`bootToUEFI` only; no power control | | `TAC_PSOC_24.pinout.json` | defines `bootToEDL` variants only; no `powerOn`/`powerOff` | | `TAC_PSOC_31.pinout.json` | `bootToNADEDL`/`bootToEAPEDL` for two subsystems; no plain `bootToEDL` | Note that `powerOn` is **not** an alias for the `powerOnTheDevice` most of these do define. Across the 28 configs that define both, `powerOn` calls `powerOnTheDevice` and *then* presses the power key for a board-specific hold time (800 ms, 3500 ms, …). Synthesising the missing one would mean inventing a power-up sequence, so the suite records the gap instead. **Fail to execute** (`XFAIL_EXECUTE`) — define the function, but its script drives a command that no pin in the config defines, so the bound method raises `AttributeError` when invoked. pytactl names the commands in a warning at load time: | Config | Drives, with no pin behind it | |--------|-------------------------------| | `TAC_FTDI_23`, `TAC_FTDI_69` | `pkey`, `voldn`, `volup` — M.2 modem cards with no buttons | | `TAC_FTDI_29` | `battery`, `pedl`, `pkey`, `sedl`, `usb0`, `voldn`, `volup` — a phone script on an RF switch box, whose only pins are `VC1`–`VC3` | | `TAC_FTDI_56` | `usb1` — board only defines `usb0` | | `TAC_FTDI_65`, `TAC_FTDI_73` | `sedl`, `usb1` | | `TAC_FTDI_67` | `sedl`, `usb1`, and `sumxs2` — which looks like a transposition typo for the board's own `smuxs2` | | `TAC_FTDI_72` | listed here too, but never gets that far — it fails to load | ## Fixed rather than carried Three configs (`TAC_FTDI_51`, `TAC_FTDI_52`, `TAC_FTDI_77`) used to be carried as `XFAIL_LOAD` for "wrong indentation": each indents two script lines with spaces where the format calls for a tab, which made the whole config unloadable. The fix is in the config files, not in the parser. Config scripts indent statements with a single tab, `installconfigs`/`convertconfigs` re-indent them on import (logging each file they touch), and the parser *requires* the tab — a config that does not follow the format is reported against, with the offending line numbers, rather than quietly accepted. All three now load and run. See `tests/test_script_parsing.py` for the parser side and `test_normalize_script_indentation` / `test_bundled_scripts_are_tab_indented` in `tests/test_tacconfig.py` for the import side. ## Notes - `TAC_PSOC_31` loads because `parse_script` renames pin commands that are not valid Python identifiers (e.g. `12vpoweroff` → `_12vpoweroff`) consistently in the script and the pin command they bind to. - The `XFAIL_EXECUTE` configs would raise `AttributeError` if their `powerOn`/etc. were called on real hardware. pytactl warns about this at load time, naming the commands, so it is visible before a board is driven. pytactl-3.2/tests/conftest.py000066400000000000000000000427141526550266300164210ustar00rootroot00000000000000# Copyright (c) 2026 Qualcomm Technologies, Inc. and/or its subsidiaries. # SPDX-License-Identifier: BSD-3-Clause """Shared fixtures and helpers for the pytactl test suite. The tests mock the USB layer (and the underlying GPIO/serial hardware) so that every ``*.pinout.json`` config of the installed config set can be loaded through the exact same code path that ``pytactl.shell`` and ``pytactl.service`` use: ``Board.create_board()``. The config set is the one bundled with pytactl in ``pytactl/tac_configs/``, or the one ``$PYTACTL_TAC_CONFIG_DIR`` names: upstream configs converted to the shared pinout format (see :mod:`pytactl.tacconfig`). A handful of configs are deliberately handled specially (see the maps below): * EXCLUDED_CONFIGS - not driven by the config-script path at all, so the suite does not try to load them through a board class. * XFAIL_LOAD - configs that fail to parse/exec. Upstream data problems that cannot be fixed from the config alone; tracked as expected failures. * XFAIL_REQUIRED - configs that load fine but legitimately omit one or more of powerOn/powerOff/bootToEDL (the README notes that not every board defines every command). * XFAIL_EXECUTE - configs whose scripts drive a command that no pin in the config defines, so invoking the quick method raises. """ import glob import json import os import shutil from collections import namedtuple from unittest.mock import MagicMock import pytest import pytactl from pytactl import debugboard, tacconfig # The config set is discovered by its shared pinout files; the UI overlays that # may sit beside them upstream are not loaded by pytactl. PINOUT_GLOB = "*" + tacconfig.PINOUT_EXTENSION def resolve_config_dir(): """Locate the directory holding the full TAC config set, or ``None``. Candidates, in order: 1. ``$PYTACTL_TAC_CONFIG_DIR`` - explicit override, for distro packagers and anyone who converts a config set somewhere of their own choosing. 2. ``pytactl.PACKAGE_TAC_CONFIG_PATH`` - the config set vendored in this repository, which is what a plain checkout tests against. The directory written by the deprecated "pytactl installconfigs" is not a candidate: it would silently replace the vendored set under test on any machine that ever ran the command. Returns ``None`` when none of them holds a ``.pinout.json`` file - e.g. a distro build that strips the bundled configs - so that the config-driven tests skip instead of failing with FileNotFoundError. """ for candidate in ( os.environ.get("PYTACTL_TAC_CONFIG_DIR"), pytactl.PACKAGE_TAC_CONFIG_PATH, ): if candidate and glob.glob(os.path.join(candidate, PINOUT_GLOB)): return candidate return None # Directory holding the config set under test, or None when it is unavailable. CONFIG_DIR = resolve_config_dir() NO_CONFIGS_REASON = ( "TAC config set not available: the configs bundled in pytactl/tac_configs " "are missing, and PYTACTL_TAC_CONFIG_DIR does not name a directory holding " "any .pinout.json file" ) # Skip marker for tests that cannot run without a config set. requires_configs = pytest.mark.skipif(CONFIG_DIR is None, reason=NO_CONFIGS_REASON) # Some tests are about the config set vendored into the package specifically, # not whichever set was resolved above. A distro that de-vendors those configs # and repoints PYTACTL_TAC_CONFIG_DIR at its own copy has nothing for them to # check, so they skip rather than fail the build. BUNDLED_CONFIGS = bool( glob.glob(os.path.join(pytactl.PACKAGE_TAC_CONFIG_PATH, PINOUT_GLOB)) ) requires_bundled_configs = pytest.mark.skipif( not BUNDLED_CONFIGS, reason="the config set bundled in pytactl/tac_configs is not present", ) # Tests that build a real git checkout to exercise pytactl's git calls. git is # optional at runtime - without it, configs are converted unannotated - so a # build environment without git skips these rather than failing. requires_git = pytest.mark.skipif( shutil.which("git") is None, reason="git is not installed; the test builds a git checkout", ) def config_path_or_skip(name): """Return the path to config ``name``, skipping the test if it is absent.""" if CONFIG_DIR is None: pytest.skip(NO_CONFIGS_REASON) path = os.path.join(CONFIG_DIR, name) if not os.path.isfile(path): pytest.skip(f"{name} not present in {CONFIG_DIR}") return path # USB vendor/product pairs that Board.create_board() dispatches on. FTDI_VENDOR = debugboard.Board.ID_VENDOR_FTDI # 0x0403 FTDI_PRODUCT = debugboard.Board.ID_PRODUCT_FTDI # 0x6011 QCOM_VENDOR = debugboard.Board.ID_VENDOR_QCOM # 0x05C6 QCOM_PRODUCT = debugboard.Board.ID_PRODUCT_QCOM # 0x9302 # Configs that are not loaded through the config-script path and so are not part # of the data-driven config tests. EXCLUDED_CONFIGS = { # Bughopper board: handled by BughopperV1Board/BughopperV2Board (driven over # USB control / HID transfers), not by a config script. "TAC_FTDI_80.pinout.json": "Bughopper board, handled by a dedicated board class", } # Configs that fail to parse/exec. Upstream data problems: left unchanged here, # because fixing one means supplying a value only the board's owner knows. XFAIL_LOAD = { "TAC_FTDI_72.pinout.json": ( "script uses $edl/$uefi/$fastboot but the config declares no variables; " "the delays are board timings only the config can supply" ), } # Configs that load but do not define all three of powerOn/powerOff/bootToEDL. # Not defects to fix here: powerOn is not an alias for the powerOnTheDevice most # of these do define - across the 28 configs defining both, powerOn calls # powerOnTheDevice and then presses the power key for a board-specific hold time # - so synthesising one would mean inventing a power-up sequence. The rest name # their functions per board (two SoCs, two EDL entries) or have no script at all. XFAIL_REQUIRED = { "TAC_FTDI_15.pinout.json": "defines bootToEDL only; no powerOn/powerOff", "TAC_FTDI_16.pinout.json": "no bootToEDL (board without EDL entry)", "TAC_FTDI_41.pinout.json": "uses spowerOn/bootToSDXEDL variants; no powerOn/bootToEDL", "TAC_FTDI_42.pinout.json": "empty script (SMART LABEL board defines no functions)", "TAC_FTDI_60.pinout.json": "defines bootToEDL/bootToUEFI only; no powerOn/powerOff", "TAC_PSOC_24.pinout.json": "defines bootToEDL variants only; no powerOn/powerOff", "TAC_PSOC_31.pinout.json": "defines bootToNADEDL/bootToEAPEDL variants; no bootToEDL", } # Configs whose powerOn/powerOff/bootToEDL drive a command that no pin in the # config defines, so the bound quick method raises AttributeError when invoked. # Each is an upstream data problem: a script carrying lines for hardware the # board does not have (TAC_FTDI_29 is an RF switch box running a phone script; # the M.2 modem cards have no power key or volume buttons). Which physical pin # to bind - if any - is a question only the board's owner can answer, so these # stay as they are. pytactl names the commands in a warning at load time. XFAIL_EXECUTE = { "TAC_FTDI_23.pinout.json": "drives pkey/voldn/volup; M.2 card has no such pins", "TAC_FTDI_29.pinout.json": ( "phone script on an RF switch box: drives battery/pedl/pkey/sedl/usb0/" "voldn/volup, board only has VC1-VC3" ), "TAC_FTDI_56.pinout.json": "drives usb1; board only defines usb0", "TAC_FTDI_65.pinout.json": "drives sedl/usb1; board defines neither", "TAC_FTDI_67.pinout.json": ( "drives sedl/usb1, and sumxs2 which looks like a typo for the board's smuxs2" ), "TAC_FTDI_69.pinout.json": "drives pkey/voldn/volup; M.2 card has no such pins", "TAC_FTDI_72.pinout.json": "undeclared variables; never reaches execution", "TAC_FTDI_73.pinout.json": "drives sedl/usb1; board defines neither", } # Describes how to make Board.create_board() load a particular config file: # which device to fake and which match key to advertise in devicelist.json. # platform_type: the value declared inside the pinout config (FTDI, PSOC, # PIC32CXAuto) # dispatch: which board class create_board() routes to: "FTDI", "PSOC" or # "PIC32CX". debugboard knows three config-matching mechanisms: # FtdiBoard matches by usb_descriptor against the USB product # string, PsocBoard by platform_id read over serial, and # Pic32cxBoard by usb_descriptor against the serial-number # prefix (the board is invisible to libusb; see dispatch_for). ConfigEntry = namedtuple( "ConfigEntry", ["name", "path", "platform_type", "dispatch", "match_value"] ) def dispatch_for(platform_type): """Return the board class create_board() routes a config's platform to. Keyed on ``platform_type`` rather than on filenames, so a config newly added upstream is checked through the path its own board class actually uses instead of falling into the FTDI default and failing to load. """ if platform_type == "PSOC": return "PSOC" if platform_type.startswith("PIC32CX"): return "PIC32CX" return "FTDI" def discover_configs(): """Return the testable ``.pinout.json`` config files (excluding special cases). Empty when the external config set is not available (see :func:`resolve_config_dir`). """ if CONFIG_DIR is None: return [] paths = sorted(glob.glob(os.path.join(CONFIG_DIR, PINOUT_GLOB))) return [p for p in paths if os.path.basename(p) not in EXCLUDED_CONFIGS] def config_params(xfail_map=None): """Build pytest.param() entries for every testable config. Configs whose basename appears in ``xfail_map`` (basename -> reason) are marked xfail(strict=True), so a config that starts passing surfaces as an XPASS and prompts the entry to be removed. """ xfail_map = xfail_map or {} configs = discover_configs() if not configs: # No config set available: emit a single skipped param so the test shows # up as skipped instead of pytest reporting an empty parameter set. return [pytest.param(None, id="no-configs", marks=requires_configs)] params = [] for path in configs: base = os.path.basename(path) marks = [] if base in xfail_map: marks.append(pytest.mark.xfail(reason=xfail_map[base], strict=True)) params.append(pytest.param(path, id=base, marks=marks)) return params def make_usb_device(vendor, product_id, serial, product_str=""): """Build a fake pyusb device exposing the attributes debugboard reads.""" dev = MagicMock(name="usb_device") dev.idVendor = vendor dev.idProduct = product_id dev.serial_number = serial dev.product = product_str return dev @pytest.fixture def patch_usb_find(monkeypatch): """Return a helper that makes ``usb.core.find`` return a given device.""" def _install(device): monkeypatch.setattr(debugboard.usb.core, "find", lambda **kwargs: device) return device return _install @pytest.fixture(autouse=True) def mock_hardware(monkeypatch): """Replace every real hardware touch point with harmless fakes. - ``GpioAsyncController`` (FTDI GPIO) becomes a MagicMock, so FtdiPort/FtdiPin logic runs without a real FTDI chip. - ``PsocPort`` (which opens a serial port in __init__) is swapped for a fake. - ``sleep`` is neutralised so config scripts with ``delay`` run instantly. """ monkeypatch.setattr(debugboard, "GpioAsyncController", MagicMock()) monkeypatch.setattr(debugboard, "sleep", lambda *a, **k: None) class _FakePsocPort(debugboard.Port): def __init__(self, serialid): debugboard.Port.__init__(self, None, serialid) self.writes = [] self.calls = [] def write(self, value, pin=None): self.writes.append((value, pin)) def call_method(self, method, value): self.calls.append((method, value)) def close(self): pass monkeypatch.setattr(debugboard, "PsocPort", _FakePsocPort) class _FakePic32cxPort(debugboard.Port): """Stand-in for Pic32cxPort, which otherwise opens a real CDC serial port via udev in __init__.""" def __init__(self, serialid): debugboard.Port.__init__(self, None, serialid) self.writes = [] def write(self, value, pin=None): self.writes.append((value, pin)) def close(self): pass monkeypatch.setattr(debugboard, "Pic32cxPort", _FakePic32cxPort) @pytest.fixture(scope="session") def prepared_configs(tmp_path_factory): """Build an isolated tac_config dir containing every testable config plus a generated ``devicelist.json`` that maps each one to a unique match key. The real ``devicelist.json`` matches most boards on a descriptor or platform id that only one config claims, so it cannot be used to reach every config from a fake USB device; this synthetic one can. Returns ``(config_dir, entries)`` where ``entries`` maps config basename to a :class:`ConfigEntry` describing how to load it via ``create_board``. Skips the requesting test when the external config set is unavailable. """ if CONFIG_DIR is None: pytest.skip(NO_CONFIGS_REASON) dst = tmp_path_factory.mktemp("tac_configs") catalog = [] entries = {} # Mirror what "installconfigs" does: install the bundled FTDI Alpaca-Lite # config as default.pinout.json, the file FtdiBoard falls back to when a # device's USB descriptor matches no catalog entry. shutil.copy( os.path.join( pytactl.PACKAGE_TAC_CONFIG_PATH, pytactl.BUNDLED_DEFAULT_CONFIG_FILENAME ), os.path.join(dst, pytactl.DEFAULT_CONFIG_FILENAME), ) for path in discover_configs(): base = os.path.basename(path) with open(path) as handle: cfg = json.load(handle) platform_type = cfg.get("platform_type", "") shutil.copy(path, os.path.join(dst, base)) dispatch = dispatch_for(platform_type) if dispatch == "PSOC": # PsocBoard matches catalog["platform_id"] against the board id read # over serial; assign a unique synthetic id we can return from the # mocked __get_board_id. platform_id = 90000 + len(entries) catalog.append({"platform_id": platform_id, "configPath": base}) entries[base] = ConfigEntry(base, path, platform_type, "PSOC", platform_id) elif dispatch == "PIC32CX": # Pic32cxBoard matches catalog["usb_descriptor"] against the part of # the serial number before "XX", so the descriptor must contain no # "XX" of its own: number them instead of naming them after the file. descriptor = f"PYTACTL{len(entries)}" catalog.append({"usb_descriptor": descriptor, "configPath": base}) entries[base] = ConfigEntry( base, path, platform_type, "PIC32CX", descriptor ) else: # FTDI (and any other FTDI-USB board): FtdiBoard matches # catalog["usb_descriptor"] against device.product. Use a unique # synthetic descriptor per file. descriptor = f"PYTACTL_TEST::{base}" catalog.append({"usb_descriptor": descriptor, "configPath": base}) entries[base] = ConfigEntry(base, path, platform_type, "FTDI", descriptor) with open(os.path.join(dst, "devicelist.json"), "w") as handle: json.dump({"catalog": catalog}, handle) return str(dst), entries def load_board(config_path, config_dir, entries, patch_usb_find, monkeypatch): """Load the board for ``config_path`` through Board.create_board, faking the device discovery so that dispatch selects this config. Each platform is loaded the way its own board class discovers a board: by USB product string (FTDI), by board id read over serial (PSOC), or by serial-number prefix after udev detection (PIC32CX).""" entry = entries[os.path.basename(config_path)] if entry.dispatch == "FTDI": device = make_usb_device( FTDI_VENDOR, FTDI_PRODUCT, "FTDI_SERIAL", entry.match_value ) patch_usb_find(device) return debugboard.Board.create_board("FTDI_SERIAL", config_dir) if entry.dispatch == "PSOC": device = make_usb_device(QCOM_VENDOR, QCOM_PRODUCT, "PSOC_SERIAL") patch_usb_find(device) # __get_board_id() talks to the board over a serial console; short-circuit # it to the synthetic platform id we registered in devicelist.json. monkeypatch.setattr( debugboard.PsocBoard, "_PsocBoard__get_board_id", lambda self: entry.match_value, ) return debugboard.Board.create_board("PSOC_SERIAL", config_dir) if entry.dispatch == "PIC32CX": # The PIC32CX board is invisible to libusb: create_board finds no USB # device and falls through to the udev-based Pic32cxBoard.detect(), which # would enumerate real serial ports. Force it, and pass a serial number # whose prefix before "XX" is the descriptor registered for this config. patch_usb_find(None) monkeypatch.setattr( debugboard.Pic32cxBoard, "detect", staticmethod(lambda serial: True) ) return debugboard.Board.create_board(f"{entry.match_value}XX01", config_dir) raise AssertionError(f"unsupported dispatch {entry.dispatch!r}") pytactl-3.2/tests/test_config_loading.py000066400000000000000000000146621526550266300205760ustar00rootroot00000000000000# Copyright (c) 2026 Qualcomm Technologies, Inc. and/or its subsidiaries. # SPDX-License-Identifier: BSD-3-Clause """Tests that every config file can be loaded through the device dispatch in ``pytactl.debugboard`` (the same path used by ``pytactl.shell`` and ``pytactl.service``) and exposes the required quick methods: powerOn, powerOff, bootToEDL. Each config is loaded through the dispatch its own platform uses - FtdiBoard, PsocBoard or Pic32cxBoard - as selected by ``conftest.dispatch_for``. Special-cased configs (excluded boards, known-broken configs, configs that omit a function or reference a disabled pin) are declared centrally in conftest.py. """ import os import pytest from conftest import ( XFAIL_EXECUTE, XFAIL_LOAD, XFAIL_REQUIRED, config_params, discover_configs, load_board, requires_bundled_configs, requires_configs, ) from pytactl import debugboard # The board class each dispatch is expected to produce, so a config routed to # the wrong path fails loudly instead of loading through a class that happens to # tolerate its contents. DISPATCH_BOARD_CLASS = { "FTDI": debugboard.FtdiBoard, "PSOC": debugboard.PsocBoard, "PIC32CX": debugboard.Pic32cxBoard, } # Functions that every config script is expected to define (unless explicitly # documented otherwise in XFAIL_REQUIRED). REQUIRED_FUNCTIONS = ("powerOn", "powerOff", "bootToEDL") @requires_configs def test_configs_exist(): """Guard against silently testing nothing if the config dir is present but holds no testable configs. Skipped outright when the external config set is unavailable (e.g. a distro build environment); see ``resolve_config_dir`` in conftest.py. """ assert discover_configs(), "no testable .pinout.json config files found" @pytest.mark.parametrize("config_path", config_params(XFAIL_LOAD)) def test_config_loads_via_usb_dispatch( config_path, prepared_configs, patch_usb_find, monkeypatch ): """Each config loads cleanly when its matching device is plugged in.""" config_dir, entries = prepared_configs entry = entries[os.path.basename(config_path)] board = load_board(config_path, config_dir, entries, patch_usb_find, monkeypatch) assert board is not None # Dispatch routed the config to the board class that drives its platform. assert isinstance(board, DISPATCH_BOARD_CLASS[entry.dispatch]) # The board was built from the config we asked for. assert board.full_config["platform_type"] == entry.platform_type @pytest.mark.parametrize("config_path", config_params({**XFAIL_LOAD, **XFAIL_REQUIRED})) def test_required_functions_available( config_path, prepared_configs, patch_usb_find, monkeypatch ): """powerOn, powerOff and bootToEDL are exposed as quick methods and as callable attributes on every board built from a config file.""" config_dir, entries = prepared_configs entry = entries[os.path.basename(config_path)] board = load_board(config_path, config_dir, entries, patch_usb_find, monkeypatch) for name in REQUIRED_FUNCTIONS: assert name in board.quick_methods, ( f"{entry.name}: config script is missing required function '{name}'" ) assert callable(getattr(board, name, None)), ( f"{entry.name}: '{name}' is not a callable bound method" ) @pytest.mark.parametrize("config_path", config_params({**XFAIL_LOAD, **XFAIL_EXECUTE})) def test_required_functions_execute( config_path, prepared_configs, patch_usb_find, monkeypatch ): """Invoking each defined required quick method runs the parsed config script end to end, driving pin writes through the (mocked) hardware without error. Only functions the board actually defines are invoked, so configs that omit one (XFAIL_REQUIRED) still exercise whatever they do define. """ config_dir, entries = prepared_configs entry = entries[os.path.basename(config_path)] board = load_board(config_path, config_dir, entries, patch_usb_find, monkeypatch) defined = [n for n in REQUIRED_FUNCTIONS if n in board.quick_methods] if not defined: # Omitting all three is a documented condition (XFAIL_REQUIRED); there is # nothing to execute here, so don't fail this test for it too. pytest.skip(f"{entry.name}: defines none of {REQUIRED_FUNCTIONS}") for name in defined: getattr(board, name)() @pytest.mark.parametrize("config_path", config_params({**XFAIL_LOAD, **XFAIL_EXECUTE})) def test_quick_method_call_wrapper( config_path, prepared_configs, patch_usb_find, monkeypatch ): """The QuickMethod wrapper used by the REST API invokes defined methods cleanly (returns {} on success, raises TACException on failure).""" config_dir, entries = prepared_configs board = load_board(config_path, config_dir, entries, patch_usb_find, monkeypatch) for name in REQUIRED_FUNCTIONS: if name in board.quick_methods: assert board.quick_methods[name].call() == {} def test_ftdi_falls_back_to_default_config( prepared_configs, patch_usb_find, monkeypatch ): """An FTDI device whose product string matches no catalog entry falls back to the default.pinout.json config (the bundled FTDI Alpaca-Lite config, platform_id 13, that 'installconfigs' installs under that name).""" from conftest import FTDI_PRODUCT, FTDI_VENDOR, make_usb_device from pytactl import debugboard config_dir, _ = prepared_configs device = make_usb_device( FTDI_VENDOR, FTDI_PRODUCT, "UNKNOWN_SERIAL", product_str="No Such Descriptor" ) patch_usb_find(device) board = debugboard.Board.create_board("UNKNOWN_SERIAL", config_dir) assert isinstance(board, debugboard.FtdiBoard) assert board.full_config["platform_id"] == 13 @requires_bundled_configs def test_ftdi_falls_back_to_the_bundled_default(patch_usb_find): """The same fallback works against the config set shipped with the package, where that config keeps its own name instead of being copied to default.pinout.json.""" from conftest import FTDI_PRODUCT, FTDI_VENDOR, make_usb_device import pytactl from pytactl import debugboard device = make_usb_device( FTDI_VENDOR, FTDI_PRODUCT, "UNKNOWN_SERIAL", product_str="No Such Descriptor" ) patch_usb_find(device) board = debugboard.Board.create_board( "UNKNOWN_SERIAL", pytactl.PACKAGE_TAC_CONFIG_PATH ) assert isinstance(board, debugboard.FtdiBoard) assert board.full_config["platform_id"] == 13 pytactl-3.2/tests/test_create_board.py000066400000000000000000000221671526550266300202450ustar00rootroot00000000000000# Copyright (c) 2026 Qualcomm Technologies, Inc. and/or its subsidiaries. # SPDX-License-Identifier: BSD-3-Clause """Tests for Board.create_board(): the USB vendor/product dispatch that maps a plugged-in device onto the correct board implementation.""" import json import shutil import sys import types from unittest.mock import MagicMock import pytest from conftest import config_path_or_skip, make_usb_device from pytactl import debugboard Board = debugboard.Board # Quick methods that the directly-driven (script-less) boards hard-code. BUGHOPPER_METHODS = ( "powerOn", "powerOff", "bootToEDL", "reset", "forceUsbcHostMode", "wakeUp", ) def test_create_board_returns_none_when_no_device(patch_usb_find, monkeypatch): monkeypatch.setattr(debugboard.usb.core, "find", lambda **kwargs: None) assert Board.create_board("missing", "./tac_configs") is None def test_create_board_dispatches_ftdi(prepared_configs, patch_usb_find): config_dir, _ = prepared_configs device = make_usb_device( Board.ID_VENDOR_FTDI, Board.ID_PRODUCT_FTDI, "S1", product_str="anything" ) patch_usb_find(device) board = Board.create_board("S1", config_dir) assert isinstance(board, debugboard.FtdiBoard) def test_create_board_dispatches_psoc(prepared_configs, patch_usb_find, monkeypatch): config_dir, entries = prepared_configs # Pick any registered PSOC platform id; skip if no PSOC configs are present. psoc_ids = [e.match_value for e in entries.values() if e.platform_type == "PSOC"] if not psoc_ids: pytest.skip("no PSOC config files present to exercise the PSOC dispatch") device = make_usb_device(Board.ID_VENDOR_QCOM, Board.ID_PRODUCT_QCOM, "S2") patch_usb_find(device) monkeypatch.setattr( debugboard.PsocBoard, "_PsocBoard__get_board_id", lambda self: psoc_ids[0], ) board = Board.create_board("S2", config_dir) assert isinstance(board, debugboard.PsocBoard) def test_create_board_dispatches_bughopper_v1(patch_usb_find): device = make_usb_device(Board.ID_VENDOR_FTDI, Board.ID_PRODUCT_BUGHOPPER_V1, "S3") patch_usb_find(device) board = Board.create_board("S3", "./tac_configs") assert isinstance(board, debugboard.BughopperV1Board) for name in BUGHOPPER_METHODS: assert name in board.quick_methods def test_create_board_bughopper_v2_exits_without_hid(patch_usb_find, monkeypatch): """If the optional hid module isn't loaded, BughopperV2 detection aborts.""" device = make_usb_device( Board.ID_VENDOR_BUGHOPPER_V2, Board.ID_PRODUCT_BUGHOPPER_V2, "S4" ) patch_usb_find(device) monkeypatch.delitem(sys.modules, "hid", raising=False) with pytest.raises(SystemExit): Board.create_board("S4", "./tac_configs") def test_create_board_dispatches_bughopper_v2_with_hid(patch_usb_find, monkeypatch): """With a (fake) hid module present, BughopperV2 is constructed.""" device = make_usb_device( Board.ID_VENDOR_BUGHOPPER_V2, Board.ID_PRODUCT_BUGHOPPER_V2, "S5" ) patch_usb_find(device) hid_device = MagicMock(name="hid_device") hid_device.serial = "S5" fake_hid = types.ModuleType("hid") fake_hid.Device = MagicMock(return_value=hid_device) monkeypatch.setitem(sys.modules, "hid", fake_hid) monkeypatch.setattr(debugboard, "hid", fake_hid, raising=False) board = Board.create_board("S5", "./tac_configs") assert isinstance(board, debugboard.BughopperV2Board) for name in BUGHOPPER_METHODS: assert name in board.quick_methods def test_bughopper_v2_hid_writes_prefix_report_id(patch_usb_find, monkeypatch): """Every HID write must begin with a 0x00 report-ID placeholder. hidapi consumes byte 0 of a write as the HID report ID. Without the 0x00 prefix the command byte is swallowed as a (non-existent) report ID on Windows and the firmware never sees the GPIO command (the board silently fails to reboot). Assert the payload survives intact behind the prefix. """ device = make_usb_device( Board.ID_VENDOR_BUGHOPPER_V2, Board.ID_PRODUCT_BUGHOPPER_V2, "S6" ) patch_usb_find(device) hid_device = MagicMock(name="hid_device") hid_device.serial = "S6" fake_hid = types.ModuleType("hid") fake_hid.Device = MagicMock(return_value=hid_device) monkeypatch.setitem(sys.modules, "hid", fake_hid) monkeypatch.setattr(debugboard, "hid", fake_hid, raising=False) board = Board.create_board("S6", "./tac_configs") board.bootToEDL() writes = [call.args[0] for call in hid_device.write.call_args_list] assert writes, "bootToEDL wrote nothing" for payload in writes: assert payload[0] == 0x00, f"missing report-ID prefix: {list(payload)}" # byte 1 is the application command (CMD_GPIO), not stripped as report ID assert payload[1] == board.CMD_GPIO # Required quick methods the PIC32CX config script defines and the test invokes. PIC32CX_CONFIG = "TAC_PIC32CXAuto_54.pinout.json" PIC32CX_METHODS = ("powerOn", "powerOff", "bootToEDL") def _prepare_pic32cx_config_dir(tmp_path, usb_descriptor): """Copy the PIC32CX config into an isolated dir alongside a devicelist.json that maps ``usb_descriptor`` (the serial prefix before "XX") to it. Skips the calling test when the config is not available (it is part of the upstream config set, not of this repository). """ shutil.copy(config_path_or_skip(PIC32CX_CONFIG), tmp_path / PIC32CX_CONFIG) catalog = { "catalog": [ { "usb_descriptor": usb_descriptor, "configPath": PIC32CX_CONFIG, } ] } (tmp_path / "devicelist.json").write_text(json.dumps(catalog)) return str(tmp_path) def test_create_board_dispatches_pic32cx(tmp_path, patch_usb_find, monkeypatch): """A PIC32CX board is invisible to libusb, so usb.core.find returns nothing and create_board falls through to the udev-based Pic32cxBoard.detect path.""" config_dir = _prepare_pic32cx_config_dir(tmp_path, "KARUSSELL") # usb.core.find finds no device; detect() (which would query udev) is forced. patch_usb_find(None) monkeypatch.setattr( debugboard.Pic32cxBoard, "detect", staticmethod(lambda serial: True) ) # The platform is identified by the serial prefix before "XX". board = Board.create_board("KARUSSELLXX01", config_dir) assert isinstance(board, debugboard.Pic32cxBoard) assert board.full_config["platform_type"] == "PIC32CXAuto" def test_create_board_pic32cx_required_methods(tmp_path, patch_usb_find, monkeypatch): """The PIC32CX board exposes powerOn/powerOff/bootToEDL as callable quick methods, and invoking them runs the parsed script through the mocked port.""" config_dir = _prepare_pic32cx_config_dir(tmp_path, "KARUSSELL") patch_usb_find(None) monkeypatch.setattr( debugboard.Pic32cxBoard, "detect", staticmethod(lambda serial: True) ) board = Board.create_board("KARUSSELLXX01", config_dir) for name in PIC32CX_METHODS: assert name in board.quick_methods assert callable(getattr(board, name, None)) getattr(board, name)() def test_create_board_pic32cx_no_matching_config_exits( tmp_path, patch_usb_find, monkeypatch ): """When no catalog entry matches the serial prefix, construction exits.""" config_dir = _prepare_pic32cx_config_dir(tmp_path, "KARUSSELL") patch_usb_find(None) monkeypatch.setattr( debugboard.Pic32cxBoard, "detect", staticmethod(lambda serial: True) ) with pytest.raises(SystemExit): Board.create_board("UNKNOWNXX01", config_dir) def test_bughopper_v2_wake_up_pulses_vol_down(patch_usb_find, monkeypatch): """wakeUp asserts and releases VOL_DOWN only, leaving the other lines alone.""" device = make_usb_device( Board.ID_VENDOR_BUGHOPPER_V2, Board.ID_PRODUCT_BUGHOPPER_V2, "S7" ) patch_usb_find(device) hid_device = MagicMock(name="hid_device") hid_device.serial = "S7" fake_hid = types.ModuleType("hid") fake_hid.Device = MagicMock(return_value=hid_device) monkeypatch.setitem(sys.modules, "hid", fake_hid) monkeypatch.setattr(debugboard, "hid", fake_hid, raising=False) monkeypatch.setattr(debugboard, "sleep", lambda s: None) board = Board.create_board("S7", "./tac_configs") board.wakeUp() writes = [call.args[0] for call in hid_device.write.call_args_list] vol_down = board.VOL_DOWN_BIT assert writes == [ bytes([0x00, board.CMD_GPIO, vol_down, vol_down]), bytes([0x00, board.CMD_GPIO, 0x00, vol_down]), ] def test_bughopper_v1_wake_up_pulses_vol_down(patch_usb_find, monkeypatch): """wakeUp asserts and releases VOL_DOWN, keeping power enabled throughout.""" device = make_usb_device(Board.ID_VENDOR_FTDI, Board.ID_PRODUCT_BUGHOPPER_V1, "S8") patch_usb_find(device) monkeypatch.setattr(debugboard, "sleep", lambda s: None) board = Board.create_board("S8", "./tac_configs") bitmodes = [] monkeypatch.setattr(board, "_ftdi_set_bitmode", bitmodes.append) board.wakeUp() masks = board.POWER_DISABLE_MASK | board.EDL_MASK | board.VOL_DOWN_MASK assert bitmodes == [masks | board.VOL_DOWN_BIT, masks] pytactl-3.2/tests/test_script_parsing.py000066400000000000000000000204621526550266300206560ustar00rootroot00000000000000# Copyright (c) 2026 Qualcomm Technologies, Inc. and/or its subsidiaries. # SPDX-License-Identifier: BSD-3-Clause """Tests for ``Board.parse_script``: turning the Alpaca automation script in a board config into callable methods. The language is flat - a ``def`` at column 0 and its body one tab in, with no nesting anywhere in the upstream config set. pytactl requires that tab rather than accepting whatever whitespace happens to be there, so that a stray space-indented line is reported against the config instead of being quietly absorbed; ``pytactl convertconfigs`` normalises a config directory to tabs (see ``tests/test_tacconfig.py``). These use small synthetic configs rather than the bundled set: they pin down the parser's behaviour, not any particular board. """ import json import logging import pytest from pytactl import debugboard def write_config(tmp_path, script, commands=("battery", "pkey"), variables=None): """Write a minimal pinout config driving ``commands`` and return its path.""" config = { "format": "tac-pinout", "schema_version": "1.0", "platform_type": "PSOC", "platform_id": 999, "name": "Test Board", "description": "Test Board", "usb_descriptor": "", "reset_enabled": False, "pins": [ { "pin_number": str(number), "command": command, "inverted": False, "initial_value": False, "initialization_priority": 0, "classic_action": "", } for number, command in enumerate(commands) ], "variables": variables or [], "script": script, } path = tmp_path / "TAC_PSOC_999.pinout.json" path.write_text(json.dumps(config)) return str(path) # -------------------------------------------------------------------------- # Indentation # -------------------------------------------------------------------------- TAB = "def powerOn()\n\tbattery 1\n\tpkey 1\n" SPACES = "def powerOn()\n battery 1\n pkey 1\n" MIXED = "def powerOn()\n\tbattery 1\n pkey 1\n" DEEP = "def powerOn()\n\t\t\tbattery 1\n\tpkey 1\n" def test_tab_indented_script_parses(tmp_path): board = debugboard.Board.create_from_config(write_config(tmp_path, TAB)) assert "powerOn" in board.quick_methods board.powerOn() assert board.pins["0"].value == 1 assert board.pins["1"].value == 1 @pytest.mark.parametrize( ("name", "script", "lines"), [ ("spaces", SPACES, "2, 3"), ("mixed", MIXED, "3"), ("over-indented", DEEP, "2"), ], ) def test_non_tab_indentation_is_rejected(name, script, lines, tmp_path): """Anything but a single tab is a config defect, reported against the config and naming the lines - not absorbed. Three upstream configs indent the odd line with spaces (TAC_FTDI_51, TAC_FTDI_52, TAC_FTDI_77); the converter re-indents them on import so the shipped configs are clean.""" path = write_config(tmp_path, script) with pytest.raises(debugboard.ConfigScriptError) as excinfo: debugboard.Board.create_from_config(path) message = str(excinfo.value) assert f"line(s) {lines}" in message assert "single tab" in message assert "convertconfigs" in message def test_crlf_line_endings_parse(tmp_path): """Some configs (the PIC32CX one) use CRLF throughout; the indentation check must read those lines the same way the rest of the parser does, and not mistake a carriage return for stray indentation.""" script = "def powerOn()\r\n\tbattery 1\r\n\tpkey 1\r\n" board = debugboard.Board.create_from_config(write_config(tmp_path, script)) assert "powerOn" in board.quick_methods board.powerOn() assert board.pins["0"].value == 1 def test_blank_lines_are_not_statements(tmp_path): """A whitespace-only line is not a statement, so it is not held to the tab rule however it is made up - 52 lines in the shipped configs are a bare tab, and a run of spaces is no worse.""" script = "def powerOn()\n\tbattery 1\n \n\tpkey 1\n" board = debugboard.Board.create_from_config(write_config(tmp_path, script)) board.powerOn() assert board.pins["1"].value == 1 # -------------------------------------------------------------------------- # Script variables # -------------------------------------------------------------------------- def test_declared_variables_are_substituted(tmp_path): path = write_config( tmp_path, "def bootToEDL()\n\tbattery 1\n\tdelay $edl\n", variables=[{"name": "edl", "default_value": "1300"}], ) board = debugboard.Board.create_from_config(path) assert "bootToEDL" in board.quick_methods board.bootToEDL() def test_undeclared_variable_is_reported_by_name(tmp_path): """TAC_FTDI_72 drives $edl/$uefi/$fastboot but declares no variables. There is nothing to substitute and the delay is a board timing only the config can supply, so say exactly that instead of letting a bare '$edl' reach exec() as a syntax error.""" path = write_config(tmp_path, "def bootToEDL()\n\tbattery 1\n\tdelay $edl\n") with pytest.raises(debugboard.ConfigScriptError) as excinfo: debugboard.Board.create_from_config(path) message = str(excinfo.value) assert "$edl" in message assert "declares none" in message def test_undeclared_variable_names_the_declared_ones(tmp_path): path = write_config( tmp_path, "def bootToEDL()\n\tdelay $edl\n\tdelay $uefi\n", variables=[{"name": "edl", "default_value": "1300"}], ) with pytest.raises(debugboard.ConfigScriptError) as excinfo: debugboard.Board.create_from_config(path) assert "$uefi" in str(excinfo.value) assert "$edl" not in str(excinfo.value) # -------------------------------------------------------------------------- # Commands the script drives but no pin implements # -------------------------------------------------------------------------- def test_unbound_command_is_warned_about_at_load(tmp_path, caplog): """Several configs drive a command no pin defines - a phone script on a board with no such line (TAC_FTDI_23 has no power key, TAC_FTDI_29 is an RF switch box). It only shows up as an AttributeError from inside the script when someone tries to power the board on, so name it at load time.""" path = write_config( tmp_path, "def powerOn()\n\tbattery 1\n\tvolup 1\n", commands=("battery",) ) with caplog.at_level(logging.WARNING): debugboard.Board.create_from_config(path) assert "'volup'" in caplog.text assert "no pin in this config defines" in caplog.text def test_no_warning_when_every_command_is_bound(tmp_path, caplog): path = write_config(tmp_path, "def powerOn()\n\tbattery 1\n\tpkey 1\n") with caplog.at_level(logging.WARNING): debugboard.Board.create_from_config(path) assert "no pin in this config defines" not in caplog.text def test_language_statements_are_not_mistaken_for_commands(tmp_path, caplog): """delay and logComment are the language's own statements, and a bare name calls another function; none of them is a pin command.""" script = ( "def powerOff()\n\tbattery 0\n" "def powerOn()\n\tpowerOff\n\tdelay 500\n\tlogComment powering on\n\tbattery 1\n" ) path = write_config(tmp_path, script, commands=("battery",)) with caplog.at_level(logging.WARNING): board = debugboard.Board.create_from_config(path) assert "no pin in this config defines" not in caplog.text board.powerOn() # -------------------------------------------------------------------------- # How a config defect reaches the user # -------------------------------------------------------------------------- def test_cli_reports_a_config_defect_without_a_traceback(tmp_path, caplog): """A config that breaks the format is a routine thing to hit when pointing --config-file-path at an unconverted upstream file, so it exits with the message rather than a traceback.""" from pytactl import shell path = write_config(tmp_path, SPACES) with caplog.at_level(logging.ERROR), pytest.raises(SystemExit) as excinfo: shell.run_oneshot("powerOn", config_file_path=path) assert excinfo.value.code == 1 assert "single tab" in caplog.text assert "convertconfigs" in caplog.text pytactl-3.2/tests/test_smoke.py000066400000000000000000000044261526550266300167470ustar00rootroot00000000000000# Copyright (c) 2026 Qualcomm Technologies, Inc. and/or its subsidiaries. # SPDX-License-Identifier: BSD-3-Clause """Minimal smoke tests that confirm the pytest setup itself is functional. These intentionally stay on the import/CLI-parser path and avoid the hardware and config-loading code, so they run with no debug board attached. Deeper board and config coverage lives in the dedicated test suite. """ import os import pytest import pytactl from pytactl import cli from pytactl.cli import build_parser, main def test_version_is_defined(): assert isinstance(pytactl.__version__, str) and pytactl.__version__ def test_default_tac_config_path_points_into_package(): path = pytactl.PACKAGE_TAC_CONFIG_PATH assert os.path.basename(path) == "tac_configs" assert path.startswith(os.path.dirname(pytactl.__file__)) assert os.path.isdir(path) def test_parser_dispatches_subcommand(): parser = build_parser() args = parser.parse_args(["list"]) assert args.mode == "list" def test_listconfigs_exits_nonzero_without_a_device_list(tmp_path, capsys): with pytest.raises(SystemExit) as excinfo: main(["listconfigs", "--tac-config-path", str(tmp_path)]) assert excinfo.value.code == 1 assert "Cannot read devicelist.json" in capsys.readouterr().out def test_listconfigs_lists_the_bundled_configs(capsys): main(["listconfigs", "--tac-config-path", pytactl.PACKAGE_TAC_CONFIG_PATH]) out = capsys.readouterr().out assert "bundled with pytactl" in out assert pytactl.BUNDLED_DEFAULT_CONFIG_FILENAME in out def test_falling_back_to_installed_configs_warns(tmp_path, monkeypatch, caplog): monkeypatch.setattr(cli, "INSTALLED_TAC_CONFIG_PATH", str(tmp_path)) monkeypatch.setattr(cli, "default_tac_config_path", lambda: str(tmp_path)) with pytest.raises(SystemExit): main(["listconfigs"]) assert "deprecated 'installconfigs'" in caplog.text def test_explicit_config_path_does_not_warn(tmp_path, monkeypatch, caplog): monkeypatch.setattr(cli, "INSTALLED_TAC_CONFIG_PATH", str(tmp_path)) monkeypatch.setattr(cli, "default_tac_config_path", lambda: str(tmp_path)) with pytest.raises(SystemExit): main(["listconfigs", "--tac-config-path", str(tmp_path)]) assert "deprecated 'installconfigs'" not in caplog.text pytactl-3.2/tests/test_tacconfig.py000066400000000000000000001127101526550266300175620ustar00rootroot00000000000000# Copyright (c) 2026 Qualcomm Technologies, Inc. and/or its subsidiaries. # SPDX-License-Identifier: BSD-3-Clause """Tests for :mod:`pytactl.tacconfig`, the converter from the upstream TAC configuration files to the shared pinout format pytactl loads. The split mirrors the one upstream introduces in `PR #54 `_: hardware description and script go to ``*.pinout.json``, UI layout stays in the ``*.tcnf`` overlay. These tests pin down the field partition, the round trip back to a combined config, and the one place the conversion adds something of its own: dropping pins that a same-named enabled pin shadows. """ import glob import json import os import subprocess import pytest from conftest import requires_bundled_configs, requires_git import pytactl from pytactl import debugboard, tacconfig # A miniature legacy combined config exercising every partition rule: identity # fields, pinout-only fields, UI-only fields, an unknown field, FTDI pin keys, # a shadowed pin pair, and a script variable. LEGACY_CONFIG = { # identity - duplicated into both files "name": "Test Board", "description": "Test Board description", "platform_type": "FTDI", "platform_id": 999, # pinout-only "usb_descriptor": "TEST DEBUG BOARD", "reset_enabled": False, "chip_count": 1, "bus": [{"chip_index": 0, "bus": "C", "bus_function": 2}], "script": "def powerOn()\n\tbattery 0\n", # UI-only "author": "somebody", "fileVersion": 1, "creation_date": "Wed Feb 15 10:59:13 2023", "modification_date": "Wed Feb 15 17:10:24 2023", "tabs": [ { "name": "General", "user_tab": False, "moveable": False, "visible": True, "configurable": True, "ordinal": 0, } ], "buttons": [ { "name": "EDL", "command": "bootToEDL", "command_group": 0, "cellLocation": "0,0", "tab": "General", "tooltip": "Boot to EDL", } ], # a field neither side knows about: must survive, in the overlay "some_future_ui_field": 42, "pins": [ { "chip_index": 0, "bus": "C", "pin_number": "0", "command": "battery", "input": False, "inverted": False, "initial_value": False, "priority": 0, "enabled": True, "name": "Battery", "help_hint": "Battery disconnect", "group": "General", "command_group": 3, "run_priority": "0,0", }, { # same command as the pin above but disabled: shadowed "chip_index": 0, "bus": "C", "pin_number": "1", "command": "battery", "input": False, "inverted": True, "initial_value": False, "priority": 1, "enabled": False, "name": "Battery (old)", "help_hint": "", "group": "General", "command_group": 3, "run_priority": "0,1", }, { # disabled but its command collides with nothing: kept "chip_index": 0, "bus": "C", "pin_number": "2", "command": "pkey", "input": False, "inverted": False, "initial_value": False, "priority": 2, "enabled": False, "name": "Power key", "help_hint": "", "group": "General", "command_group": 3, "run_priority": "0,2", }, ], "variables": [ { "name": "edl", "default_value": "100", "label": "EDL timing (ms)", "tooltip": "How long to hold EDL", "type": 1, "cellLocation": "0,0", } ], } def pin_by_number(pins, number): return next(p for p in pins if str(p.get("pin_number")) == str(number)) def write_json(path, obj): path.write_text(json.dumps(obj)) return str(path) # -------------------------------------------------------------------------- # File naming # -------------------------------------------------------------------------- @pytest.mark.parametrize( ("name", "expected"), [ ("TAC_FTDI_15.tcnf", "TAC_FTDI_15.pinout.json"), ("/some/dir/TAC_PSOC_7.tcnf", "TAC_PSOC_7.pinout.json"), # idempotent: an already-converted name maps to itself ("TAC_FTDI_15.pinout.json", "TAC_FTDI_15.pinout.json"), ("no_extension", "no_extension.pinout.json"), ], ) def test_pinout_filename_for(name, expected): assert tacconfig.pinout_filename_for(name) == expected # -------------------------------------------------------------------------- # Splitting # -------------------------------------------------------------------------- def test_split_writes_self_describing_envelope(): """Third-party tools key off ``format`` before parsing anything else.""" pinout, overlay = tacconfig.split_configuration(LEGACY_CONFIG) assert pinout["format"] == tacconfig.PINOUT_FORMAT assert pinout["schema_version"] == tacconfig.PINOUT_SCHEMA_VERSION assert pinout["$schema"] == tacconfig.PINOUT_SCHEMA_URL assert tacconfig.is_pinout(pinout) # The envelope belongs to the pinout file alone. assert not tacconfig.is_pinout(overlay) def test_split_partitions_top_level_fields(): pinout, overlay = tacconfig.split_configuration(LEGACY_CONFIG) for field in tacconfig.IDENTITY_FIELDS: assert pinout[field] == LEGACY_CONFIG[field] assert overlay[field] == LEGACY_CONFIG[field] for field in ("usb_descriptor", "reset_enabled", "chip_count", "bus", "script"): assert pinout[field] == LEGACY_CONFIG[field] assert field not in overlay for field in ("author", "fileVersion", "tabs", "buttons"): assert overlay[field] == LEGACY_CONFIG[field] assert field not in pinout def test_split_sends_unknown_fields_to_the_overlay(): """An unrecognised field is UI baggage until proven otherwise, so it lands in the overlay rather than being dropped.""" pinout, overlay = tacconfig.split_configuration(LEGACY_CONFIG) assert overlay["some_future_ui_field"] == 42 assert "some_future_ui_field" not in pinout def test_split_partitions_pin_fields(): pinout, overlay = tacconfig.split_configuration(LEGACY_CONFIG) hardware = pin_by_number(pinout["pins"], 0) assert hardware == { "chip_index": 0, "bus": "C", "pin_number": "0", "command": "battery", "input": False, "inverted": False, "initial_value": False, "priority": 0, } ui = next(p for p in overlay["pins"] if p["ref"]["pin_number"] == "0") assert ui["ref"] == {"chip_index": 0, "bus": "C", "pin_number": "0"} assert ui["enabled"] is True assert ui["name"] == "Battery" assert ui["help_hint"] == "Battery disconnect" # No hardware field leaks into the overlay pin. assert not set(ui) & set(tacconfig.PIN_HARDWARE_FIELDS) def test_split_partitions_variables(): """The script substitutes ``default_value``, so it travels with the pinout; the label/tooltip/layout stay behind. ``name`` is the join key, so both sides keep it.""" pinout, overlay = tacconfig.split_configuration(LEGACY_CONFIG) assert pinout["variables"] == [{"name": "edl", "default_value": "100"}] assert overlay["variables"] == [ { "name": "edl", "label": "EDL timing (ms)", "tooltip": "How long to hold EDL", "type": 1, "cellLocation": "0,0", } ] def test_split_always_emits_pins_and_variables(): """Both arrays are required by the pinout schema even when the legacy config never declared them (most FTDI configs have no variables at all).""" pinout, overlay = tacconfig.split_configuration({"name": "bare"}) assert pinout["pins"] == [] assert pinout["variables"] == [] assert overlay["pins"] == [] assert overlay["variables"] == [] def test_split_writes_pinout_ref_into_the_overlay(): _, overlay = tacconfig.split_configuration( LEGACY_CONFIG, pinout_ref="TAC_FTDI_999.pinout.json" ) assert overlay[tacconfig.PINOUT_REF] == "TAC_FTDI_999.pinout.json" assert tacconfig.is_overlay(overlay) # -------------------------------------------------------------------------- # Merging # -------------------------------------------------------------------------- def test_merge_round_trips_a_split_config(): pinout, overlay = tacconfig.split_configuration( LEGACY_CONFIG, pinout_ref="TAC_FTDI_999.pinout.json" ) assert tacconfig.merge_configuration(pinout, overlay) == LEGACY_CONFIG def test_merge_drops_the_envelope_and_the_pinout_ref(): pinout, overlay = tacconfig.split_configuration( LEGACY_CONFIG, pinout_ref="TAC_FTDI_999.pinout.json" ) combined = tacconfig.merge_configuration(pinout, overlay) for key in ("$schema", "format", "schema_version", tacconfig.PINOUT_REF): assert key not in combined def test_merge_drops_the_provenance_annotation(): """The annotation describes the file, not the board, so it is envelope: it must not leak into a merged config and from there into the UI overlay on the next split.""" pinout, overlay = tacconfig.split_configuration(LEGACY_CONFIG) annotated = tacconfig.annotate_source(pinout, {"commit": "deadbeef"}, "x.tcnf") combined = tacconfig.merge_configuration(annotated, overlay) assert tacconfig.SOURCE_FIELD not in combined assert combined == tacconfig.merge_configuration(pinout, overlay) def test_merge_prefers_the_overlay_on_identity_fields(): """Both files carry the identity fields; the overlay is authoritative, because that is the one the QTAC configuration editor writes.""" pinout, overlay = tacconfig.split_configuration(LEGACY_CONFIG) overlay["name"] = "Renamed Board" combined = tacconfig.merge_configuration(pinout, overlay) assert combined["name"] == "Renamed Board" def test_merge_ignores_an_overlay_pin_with_no_hardware_counterpart(): """The pinout file drives the pin list: a UI entry for a pin that is not in it (e.g. one this converter dropped) does not resurrect the pin.""" pinout, overlay = tacconfig.split_configuration(LEGACY_CONFIG) pinout["pins"] = [p for p in pinout["pins"] if p["pin_number"] != "1"] combined = tacconfig.merge_configuration(pinout, overlay) assert [p["pin_number"] for p in combined["pins"]] == ["0", "2"] # -------------------------------------------------------------------------- # Shadowed pins - the enablement decision baked into the conversion # -------------------------------------------------------------------------- def test_shadowed_pin_keys_finds_the_disabled_duplicate(): shadowed = tacconfig.shadowed_pin_keys(LEGACY_CONFIG["pins"]) assert shadowed == {("0", "C", "1")} def test_shadowed_pin_keys_keeps_a_disabled_pin_with_its_own_command(): """Disabled pins are not dropped wholesale - only when an enabled pin would otherwise be overwritten by one.""" pins = [ {"pin_number": "0", "command": "battery", "enabled": True}, {"pin_number": "1", "command": "pkey", "enabled": False}, ] assert tacconfig.shadowed_pin_keys(pins) == set() def test_shadowed_pin_keys_ignores_duplicate_enabled_pins(): """Two enabled pins sharing a command are a config quirk this conversion does not arbitrate; it only resolves enabled-vs-disabled.""" pins = [ {"pin_number": "0", "command": "eud", "enabled": True}, {"pin_number": "1", "command": "eud", "enabled": True}, ] assert tacconfig.shadowed_pin_keys(pins) == set() def test_convert_configuration_drops_shadowed_pins(): pinout = tacconfig.convert_configuration(LEGACY_CONFIG) numbers = [p["pin_number"] for p in pinout["pins"]] assert numbers == ["0", "2"] # The surviving 'battery' pin is the enabled one (inverted False, not the # disabled pin 1 which is inverted). assert pin_by_number(pinout["pins"], 0)["inverted"] is False # -------------------------------------------------------------------------- # Loading a config file in any of the three shapes # -------------------------------------------------------------------------- def test_convert_file_reads_a_legacy_combined_config(tmp_path): path = write_json(tmp_path / "TAC_FTDI_999.tcnf", LEGACY_CONFIG) pinout = tacconfig.convert_file(path) assert tacconfig.is_pinout(pinout) assert [p["pin_number"] for p in pinout["pins"]] == ["0", "2"] def test_convert_file_returns_a_pinout_file_unchanged(tmp_path): expected = tacconfig.convert_configuration(LEGACY_CONFIG) path = write_json(tmp_path / "TAC_FTDI_999.pinout.json", expected) assert tacconfig.convert_file(path) == expected def test_convert_file_resolves_a_split_pair(tmp_path): """Pointed at the UI overlay of an already-split upstream config, the loader picks up the sibling pinout file and applies the overlay's pin enablement - so pytactl gets the same pin set either way.""" pinout, overlay = tacconfig.split_configuration( LEGACY_CONFIG, pinout_ref="TAC_FTDI_999.pinout.json" ) write_json(tmp_path / "TAC_FTDI_999.pinout.json", pinout) overlay_path = write_json(tmp_path / "TAC_FTDI_999.tcnf", overlay) loaded = tacconfig.convert_file(overlay_path) assert loaded == tacconfig.convert_configuration(LEGACY_CONFIG) def test_convert_file_rejects_a_dangling_pinout_ref(tmp_path): """A ``pinout_ref`` pointing at something that is not a pinout file is an error, not silently treated as a config.""" write_json(tmp_path / "TAC_FTDI_999.pinout.json", {"pins": []}) overlay_path = write_json( tmp_path / "TAC_FTDI_999.tcnf", {"pinout_ref": "TAC_FTDI_999.pinout.json"} ) with pytest.raises(tacconfig.ConfigFormatError): tacconfig.convert_file(overlay_path) def test_convert_file_rejects_an_unrelated_json_file(tmp_path): path = write_json(tmp_path / "devicelist.json", {"catalog": []}) with pytest.raises(tacconfig.ConfigFormatError): tacconfig.convert_file(path) # -------------------------------------------------------------------------- # devicelist.json # -------------------------------------------------------------------------- def test_rewrite_device_list_points_entries_at_the_pinout_files(): device_list = { "catalog": [ # repository-relative path -> bare converted file name {"configPath": "../../configurations/TAC_FTDI_15.tcnf"}, # empty -> the generated FTDI Alpaca-Lite default {"configPath": ""}, # already converted -> left alone {"configPath": "TAC_PSOC_7.pinout.json"}, ] } patched = tacconfig.rewrite_device_list(device_list, "default.pinout.json") assert [e["configPath"] for e in device_list["catalog"]] == [ "TAC_FTDI_15.pinout.json", "default.pinout.json", "TAC_PSOC_7.pinout.json", ] assert patched == 2 # -------------------------------------------------------------------------- # Directory conversion (what "convertconfigs" and "installconfigs" drive) # -------------------------------------------------------------------------- @pytest.fixture def legacy_dir(tmp_path): """A source directory in the shape upstream ships today.""" source = tmp_path / "configurations" source.mkdir() write_json(source / "TAC_FTDI_999.tcnf", LEGACY_CONFIG) write_json( source / "devicelist.json", { "catalog": [ {"configPath": "../../configurations/TAC_FTDI_999.tcnf"}, {"configPath": ""}, ] }, ) return source def test_convert_directory_writes_pinout_files_and_devicelist(legacy_dir, tmp_path): destination = tmp_path / "installed" result = tacconfig.convert_directory( str(legacy_dir), str(destination), default_filename="default.pinout.json" ) assert result["converted"] == ["TAC_FTDI_999.pinout.json"] assert result["failed"] == [] assert result["device_list"] is True pinout = json.loads((destination / "TAC_FTDI_999.pinout.json").read_text()) assert tacconfig.is_pinout(pinout) assert [p["pin_number"] for p in pinout["pins"]] == ["0", "2"] device_list = json.loads((destination / "devicelist.json").read_text()) assert [e["configPath"] for e in device_list["catalog"]] == [ "TAC_FTDI_999.pinout.json", "default.pinout.json", ] # Only the pinout half is installed unless the overlay is asked for. assert not (destination / "TAC_FTDI_999.tcnf").exists() def test_convert_directory_can_write_the_ui_overlay(legacy_dir, tmp_path): destination = tmp_path / "installed" tacconfig.convert_directory(str(legacy_dir), str(destination), write_overlay=True) overlay = json.loads((destination / "TAC_FTDI_999.tcnf").read_text()) assert overlay[tacconfig.PINOUT_REF] == "TAC_FTDI_999.pinout.json" assert overlay["tabs"] == LEGACY_CONFIG["tabs"] # The overlay drops the pin the pinout dropped, so the pair stays consistent. assert [p["ref"]["pin_number"] for p in overlay["pins"]] == ["0", "2"] def test_convert_directory_dry_run_writes_nothing(legacy_dir, tmp_path): destination = tmp_path / "installed" result = tacconfig.convert_directory( str(legacy_dir), str(destination), dry_run=True ) assert result["converted"] == ["TAC_FTDI_999.pinout.json"] assert not destination.exists() def test_convert_directory_converts_in_place_by_default(legacy_dir): tacconfig.convert_directory(str(legacy_dir)) assert (legacy_dir / "TAC_FTDI_999.pinout.json").is_file() def test_convert_directory_is_idempotent(legacy_dir, tmp_path): """Running the converter over its own output must not change it - the installed set can be re-converted, and an already-split upstream is handled the same as a legacy one.""" destination = tmp_path / "installed" tacconfig.convert_directory(str(legacy_dir), str(destination)) first = (destination / "TAC_FTDI_999.pinout.json").read_text() tacconfig.convert_directory(str(destination), str(destination)) assert (destination / "TAC_FTDI_999.pinout.json").read_text() == first def test_convert_directory_reports_a_broken_config(legacy_dir, tmp_path): """One unparseable config does not abort the whole directory.""" (legacy_dir / "TAC_BROKEN_1.tcnf").write_text("{not json") destination = tmp_path / "installed" result = tacconfig.convert_directory(str(legacy_dir), str(destination)) assert result["converted"] == ["TAC_FTDI_999.pinout.json"] assert [name for name, _ in result["failed"]] == ["TAC_BROKEN_1.tcnf"] def test_convert_directory_without_a_devicelist(tmp_path): source = tmp_path / "configurations" source.mkdir() write_json(source / "TAC_FTDI_999.tcnf", LEGACY_CONFIG) result = tacconfig.convert_directory(str(source), str(tmp_path / "installed")) assert result["device_list"] is False # -------------------------------------------------------------------------- # Script indentation # -------------------------------------------------------------------------- @pytest.mark.parametrize( ("name", "script", "expected", "changed"), [ ("tabs are left alone", "def a()\n\tbattery 1\n", "def a()\n\tbattery 1\n", 0), ("spaces", "def a()\n battery 1\n", "def a()\n\tbattery 1\n", 1), ( "over-indented", "def a()\n\t\tbattery 1\n", "def a()\n\tbattery 1\n", 1, ), ( "crlf is preserved", "def a()\r\n battery 1\r\n", "def a()\r\n\tbattery 1\r\n", 1, ), ("blank lines untouched", "def a()\n \n\tb 1\n", "def a()\n \n\tb 1\n", 0), ("empty script", "", "", 0), ], ) def test_normalize_script_indentation(name, script, expected, changed): """Conversion is the import boundary, so it is where a script is made to indent with tabs - what `Board.parse_script` requires.""" assert tacconfig.normalize_script_indentation(script) == (expected, changed) def test_convert_directory_re_indents_scripts_with_tabs(tmp_path): """TAC_FTDI_51, TAC_FTDI_52 and TAC_FTDI_77 each indent two lines with spaces upstream; importing them yields configs pytactl will load.""" source = tmp_path / "configurations" source.mkdir() spaced = dict(LEGACY_CONFIG, script="def powerOn()\n battery 1\n\tpkey 1\n") write_json(source / "TAC_FTDI_999.tcnf", spaced) destination = tmp_path / "installed" tacconfig.convert_directory(str(source), str(destination)) script = json.loads((destination / "TAC_FTDI_999.pinout.json").read_text())[ "script" ] assert script == "def powerOn()\n\tbattery 1\n\tpkey 1\n" @requires_bundled_configs def test_bundled_scripts_are_tab_indented(): """Every statement in every shipped config is indented with exactly one tab, which is what the parser requires; nothing relies on it being lenient.""" offenders = [] for path in glob.glob( os.path.join(pytactl.PACKAGE_TAC_CONFIG_PATH, "*" + tacconfig.PINOUT_EXTENSION) ): with open(path) as handle: script = json.load(handle)["script"] for number, line in enumerate(script.splitlines(), 1): if not line.strip(): continue indent = line[: len(line) - len(line.lstrip())] if indent and indent != "\t": offenders.append(f"{os.path.basename(path)}:{number}") assert not offenders, f"not indented with a single tab: {offenders}" # -------------------------------------------------------------------------- # Provenance annotation # -------------------------------------------------------------------------- def git_checkout(tmp_path, remote="https://example.invalid/qtac.git"): """Make a one-commit git checkout and return (path, commit).""" subprocess.run(["git", "init", "-q", str(tmp_path)], check=True) for args in ( ["config", "user.email", "test@example.invalid"], ["config", "user.name", "Test"], ["remote", "add", "origin", remote], ): subprocess.run(["git", "-C", str(tmp_path), *args], check=True) (tmp_path / "marker").write_text("x") subprocess.run(["git", "-C", str(tmp_path), "add", "marker"], check=True) subprocess.run(["git", "-C", str(tmp_path), "commit", "-qm", "initial"], check=True) commit = subprocess.run( ["git", "-C", str(tmp_path), "rev-parse", "HEAD"], capture_output=True, text=True, check=True, ).stdout.strip() return tmp_path, commit def test_annotate_source_records_the_origin_after_the_envelope(): """The annotation goes straight after the envelope so it reads at the top of the file, and the config data below it is untouched.""" pinout = tacconfig.convert_configuration(LEGACY_CONFIG) annotated = tacconfig.annotate_source( pinout, {"repository": "https://example.invalid/qtac", "commit": "abc123"}, "TAC_FTDI_999.tcnf", ) assert list(annotated)[:4] == [ "$schema", "format", "schema_version", tacconfig.SOURCE_FIELD, ] assert annotated[tacconfig.SOURCE_FIELD] == { "repository": "https://example.invalid/qtac", "commit": "abc123", "file": "TAC_FTDI_999.tcnf", } assert {k: v for k, v in annotated.items() if k != tacconfig.SOURCE_FIELD} == pinout def test_annotate_source_replaces_an_earlier_annotation(): """Re-importing a config from a newer revision restamps it rather than accumulating annotations.""" pinout = tacconfig.convert_configuration(LEGACY_CONFIG) first = tacconfig.annotate_source(pinout, {"commit": "old"}, "x.tcnf") second = tacconfig.annotate_source(first, {"commit": "new"}, "x.tcnf") assert second[tacconfig.SOURCE_FIELD] == {"commit": "new", "file": "x.tcnf"} def test_annotate_source_without_a_filename(): pinout = tacconfig.convert_configuration(LEGACY_CONFIG) annotated = tacconfig.annotate_source(pinout, {"commit": "abc123"}) assert annotated[tacconfig.SOURCE_FIELD] == {"commit": "abc123"} @requires_git def test_git_source_info_reads_the_checkout(tmp_path): checkout, commit = git_checkout(tmp_path) configurations = checkout / "configurations" configurations.mkdir() source = tacconfig.git_source_info(str(configurations)) assert source == { "repository": "https://example.invalid/qtac.git", "commit": commit, "path": "configurations", } @requires_git def test_git_source_info_omits_the_path_at_the_top_of_the_checkout(tmp_path): checkout, commit = git_checkout(tmp_path) assert tacconfig.git_source_info(str(checkout)) == { "repository": "https://example.invalid/qtac.git", "commit": commit, } def test_git_source_info_returns_none_outside_a_checkout(tmp_path): """Provenance is recorded only when it is actually known.""" plain = tmp_path / "not-a-checkout" plain.mkdir() assert tacconfig.git_source_info(str(plain)) is None def test_git_source_info_returns_none_without_git(tmp_path, monkeypatch): """git is optional: with no git to run, provenance is simply unknown.""" checkout = tmp_path / "checkout" checkout.mkdir() no_git = tmp_path / "empty-bin" no_git.mkdir() monkeypatch.setenv("PATH", str(no_git)) assert tacconfig.git_source_info(str(checkout)) is None def test_convert_directory_converts_unannotated_without_git( legacy_dir, tmp_path, monkeypatch ): no_git = tmp_path / "empty-bin" no_git.mkdir() monkeypatch.setenv("PATH", str(no_git)) destination = tmp_path / "installed" result = tacconfig.convert_directory(str(legacy_dir), str(destination)) assert result["converted"] == ["TAC_FTDI_999.pinout.json"] pinout = json.loads((destination / "TAC_FTDI_999.pinout.json").read_text()) assert tacconfig.SOURCE_FIELD not in pinout def stub_git_source_info(monkeypatch, source): """Make every directory look like a checkout described by ``source``, and return the list of directories it was asked about.""" asked = [] def git_source_info(directory): asked.append(directory) return dict(source) monkeypatch.setattr(tacconfig, "git_source_info", git_source_info) return asked def test_convert_directory_annotates_from_the_source_checkout( legacy_dir, tmp_path, monkeypatch ): observed = { "repository": "https://example.invalid/qtac.git", "commit": "1" * 40, "path": "configurations", } asked = stub_git_source_info(monkeypatch, observed) destination = tmp_path / "installed" tacconfig.convert_directory(str(legacy_dir), str(destination)) assert asked == [str(legacy_dir)] assert json.loads((destination / "TAC_FTDI_999.pinout.json").read_text())[ tacconfig.SOURCE_FIELD ] == {**observed, "file": "TAC_FTDI_999.tcnf"} def test_convert_directory_uses_the_source_info_it_is_given(legacy_dir, tmp_path): """What the caller states wins: "installconfigs" knows the repository and the commit it resolved the ref to, which no local checkout can supply.""" destination = tmp_path / "installed" stated = { "repository": "https://example.invalid/qtac", "ref": "main", "commit": "0" * 40, } tacconfig.convert_directory(str(legacy_dir), str(destination), source_info=stated) assert json.loads((destination / "TAC_FTDI_999.pinout.json").read_text())[ tacconfig.SOURCE_FIELD ] == {**stated, "file": "TAC_FTDI_999.tcnf"} def test_convert_directory_can_skip_annotating(legacy_dir, tmp_path): """Configs written with annotate=False validate against upstream's pinout schema unchanged, which forbids the extra key.""" destination = tmp_path / "installed" tacconfig.convert_directory(str(legacy_dir), str(destination), annotate=False) pinout = json.loads((destination / "TAC_FTDI_999.pinout.json").read_text()) assert tacconfig.SOURCE_FIELD not in pinout def test_convert_directory_does_not_restamp_an_imported_set(tmp_path, monkeypatch): """Re-converting an already-imported set from inside another checkout must keep the provenance it has: the observed repository is not where those configs came from.""" imported = tmp_path / "vendored" imported.mkdir() original = tacconfig.annotate_source( tacconfig.convert_configuration(LEGACY_CONFIG), {"repository": "https://example.invalid/qtac", "commit": "0" * 40}, "TAC_FTDI_999.tcnf", ) write_json(imported / "TAC_FTDI_999.pinout.json", original) # The *wrong* repository, observed around the imported set. stub_git_source_info( monkeypatch, {"repository": "https://example.invalid/pytactl.git", "commit": "1" * 40}, ) tacconfig.convert_directory(str(imported)) assert ( json.loads((imported / "TAC_FTDI_999.pinout.json").read_text())[ tacconfig.SOURCE_FIELD ] == original[tacconfig.SOURCE_FIELD] ) def test_convert_file_keeps_the_annotation_of_a_split_pair(tmp_path): """Resolving an overlay to its pinout goes through a merge, which drops the envelope; the annotation describes the same file either way, so it survives.""" pinout, overlay = tacconfig.split_configuration( LEGACY_CONFIG, pinout_ref="TAC_FTDI_999.pinout.json" ) annotated = tacconfig.annotate_source(pinout, {"commit": "abc123"}, "x.tcnf") write_json(tmp_path / "TAC_FTDI_999.pinout.json", annotated) overlay_path = write_json(tmp_path / "TAC_FTDI_999.tcnf", overlay) loaded = tacconfig.convert_file(overlay_path) assert loaded[tacconfig.SOURCE_FIELD] == {"commit": "abc123", "file": "x.tcnf"} # -------------------------------------------------------------------------- # The bundled default, and the board built from a converted config # -------------------------------------------------------------------------- @requires_bundled_configs def test_bundled_default_config_is_a_pinout_file(): path = os.path.join( pytactl.PACKAGE_TAC_CONFIG_PATH, pytactl.BUNDLED_DEFAULT_CONFIG_FILENAME ) with open(path) as handle: config = json.load(handle) assert tacconfig.is_pinout(config) assert config["platform_id"] == 13 assert pytactl.DEFAULT_CONFIG_FILENAME.endswith(tacconfig.PINOUT_EXTENSION) @requires_bundled_configs def test_bundled_config_set_is_all_pinout_files(): """Every config vendored into the package is in the format pytactl loads.""" paths = glob.glob( os.path.join(pytactl.PACKAGE_TAC_CONFIG_PATH, "*" + tacconfig.PINOUT_EXTENSION) ) assert len(paths) > 1, "the bundled config set is missing" for path in paths: with open(path) as handle: config = json.load(handle) assert tacconfig.is_pinout(config), path assert config["schema_version"] == tacconfig.PINOUT_SCHEMA_VERSION, path @requires_bundled_configs def test_bundled_configs_record_the_upstream_commit(): """Every vendored config says which qcom-test-automation-controller commit it was imported from. Configs are synced from upstream file by file (see scripts/sync_upstream_configs.py), so they need not all name the same one; each must name a full commit SHA, though, not a ref that moves.""" for path in glob.glob( os.path.join(pytactl.PACKAGE_TAC_CONFIG_PATH, "*" + tacconfig.PINOUT_EXTENSION) ): with open(path) as handle: source = json.load(handle).get(tacconfig.SOURCE_FIELD) assert source, f"{os.path.basename(path)} is not annotated" assert "qcom-test-automation-controller" in source["repository"], path commit = source["commit"] assert len(commit) == 40 and all(c in "0123456789abcdef" for c in commit), path @requires_bundled_configs def test_bundled_devicelist_resolves_to_bundled_configs(): """No catalog entry points at a config the package does not ship - including the entries with no config of their own, which point at the FTDI Alpaca-Lite default under its bundled name.""" with open(os.path.join(pytactl.PACKAGE_TAC_CONFIG_PATH, "devicelist.json")) as f: device_list = json.load(f) catalog = device_list["catalog"] assert catalog for entry in catalog: config_path = entry["configPath"] assert config_path.endswith(tacconfig.PINOUT_EXTENSION), entry assert os.path.isfile( os.path.join(pytactl.PACKAGE_TAC_CONFIG_PATH, config_path) ), f"devicelist.json points at a missing config: {config_path}" def test_default_config_file_prefers_the_installed_copy(tmp_path): """A directory populated by "installconfigs" holds the FTDI Alpaca-Lite default under the generic name; that copy wins.""" (tmp_path / pytactl.DEFAULT_CONFIG_FILENAME).write_text("{}") (tmp_path / pytactl.BUNDLED_DEFAULT_CONFIG_FILENAME).write_text("{}") assert pytactl.default_config_file(str(tmp_path)) == str( tmp_path / pytactl.DEFAULT_CONFIG_FILENAME ) def test_default_config_file_accepts_the_bundled_name(tmp_path): """The config set shipped with the package keeps the config under its own name rather than duplicating it, so that name is resolved too.""" (tmp_path / pytactl.BUNDLED_DEFAULT_CONFIG_FILENAME).write_text("{}") assert pytactl.default_config_file(str(tmp_path)) == str( tmp_path / pytactl.BUNDLED_DEFAULT_CONFIG_FILENAME ) def test_default_config_file_returns_none_when_absent(tmp_path): assert pytactl.default_config_file(str(tmp_path)) is None def test_board_binds_the_enabled_pin_not_the_shadowed_one(tmp_path): """The regression the shadowed-pin handling exists to prevent. ``enabled`` does not survive into the pinout file, and pytactl binds a command to a pin with ``setattr``, so a disabled duplicate listed after the enabled pin would silently take over the command and drive the wrong physical line. """ path = write_json(tmp_path / "TAC_FTDI_999.tcnf", LEGACY_CONFIG) board = debugboard.Board.create_from_config(path) assert sorted(board.pins) == ["0", "2"] assert board.pins["0"].command == "battery" # 'battery' resolves to the enabled pin's setter, not the disabled pin's. assert board.battery == board.pins["0"].set def test_board_loads_an_already_split_config_pair(tmp_path): """Pointing pytactl at an upstream split pair yields the same board as the legacy combined config it came from.""" pinout, overlay = tacconfig.split_configuration( LEGACY_CONFIG, pinout_ref="TAC_FTDI_999.pinout.json" ) write_json(tmp_path / "TAC_FTDI_999.pinout.json", pinout) overlay_path = write_json(tmp_path / "TAC_FTDI_999.tcnf", overlay) board = debugboard.Board.create_from_config(overlay_path) assert sorted(board.pins) == ["0", "2"] assert callable(getattr(board, "powerOn", None)) def test_board_creates_ports_from_the_platform_type(tmp_path): """The pinout config names the platform, so the port layout no longer has to be inferred from the config file's name.""" path = write_json(tmp_path / "unrecognisable-name.json", LEGACY_CONFIG) board = debugboard.Board.create_from_config(path) # bus C is declared with bus_function 2, so it becomes a port. assert sorted(board.ports) == ["C"] def write_config_set(directory, catalog): """Write a config directory holding ``catalog`` and a valid pinout file.""" pinout = tacconfig.convert_configuration(LEGACY_CONFIG) write_json(directory / "TAC_FTDI_999.pinout.json", pinout) write_json(directory / "devicelist.json", {"catalog": catalog}) def test_list_directory_resolves_catalog_entries(tmp_path): write_config_set( tmp_path, [ { "name": "Test Board", "platform_id": 999, "usb_descriptor": "TEST DEBUG BOARD", "configPath": "../../configurations/TAC_FTDI_999.pinout.json", } ], ) listing = tacconfig.list_directory(str(tmp_path)) assert listing == { "entries": [ { "name": "Test Board", "platform_id": 999, "usb_descriptor": "TEST DEBUG BOARD", "configPath": "TAC_FTDI_999.pinout.json", "status": "ok", } ], "unreferenced": [], } def test_list_directory_reports_missing_and_invalid_configs(tmp_path): write_config_set( tmp_path, [ {"name": "Missing", "configPath": "TAC_FTDI_1.pinout.json"}, {"name": "No path", "configPath": ""}, {"name": "Invalid", "configPath": "TAC_FTDI_2.pinout.json"}, ], ) write_json(tmp_path / "TAC_FTDI_2.pinout.json", {"unrelated": True}) listing = tacconfig.list_directory(str(tmp_path)) statuses = {entry["name"]: entry["status"] for entry in listing["entries"]} assert statuses == { "Missing": "missing", "No path": "missing", "Invalid": "invalid", } assert all("error" in entry for entry in listing["entries"]) assert listing["unreferenced"] == ["TAC_FTDI_999.pinout.json"] def test_list_directory_requires_a_device_list(tmp_path): with pytest.raises(OSError): tacconfig.list_directory(str(tmp_path)) @requires_bundled_configs def test_bundled_device_list_has_a_loadable_config_for_every_board(): listing = tacconfig.list_directory(pytactl.PACKAGE_TAC_CONFIG_PATH) assert listing["entries"] assert [entry for entry in listing["entries"] if entry["status"] != "ok"] == []