pax_global_header 0000666 0000000 0000000 00000000064 15265502663 0014524 g ustar 00root root 0000000 0000000 52 comment=222f0e738bbbec2a75a7634df73ea18c594671ea
pytactl-3.2/ 0000775 0000000 0000000 00000000000 15265502663 0013050 5 ustar 00root root 0000000 0000000 pytactl-3.2/.github/ 0000775 0000000 0000000 00000000000 15265502663 0014410 5 ustar 00root root 0000000 0000000 pytactl-3.2/.github/workflows/ 0000775 0000000 0000000 00000000000 15265502663 0016445 5 ustar 00root root 0000000 0000000 pytactl-3.2/.github/workflows/lint.yml 0000664 0000000 0000000 00000001366 15265502663 0020144 0 ustar 00root root 0000000 0000000 name: 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.yml 0000664 0000000 0000000 00000004430 15265502663 0020637 0 ustar 00root root 0000000 0000000 # 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.yml 0000664 0000000 0000000 00000001207 15265502663 0023347 0 ustar 00root root 0000000 0000000 name: 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.yml 0000664 0000000 0000000 00000003533 15265502663 0020614 0 ustar 00root root 0000000 0000000 # 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.yml 0000664 0000000 0000000 00000001763 15265502663 0020156 0 ustar 00root root 0000000 0000000 # 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.yml 0000664 0000000 0000000 00000012274 15265502663 0023253 0 ustar 00root root 0000000 0000000 # 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/.gitignore 0000664 0000000 0000000 00000000206 15265502663 0015036 0 ustar 00root root 0000000 0000000 # Python bytecode
__pycache__/
*.py[cod]
# Packaging / build artifacts
build/
dist/
*.egg-info/
# Virtual environments
venv/
.venv/
pytactl-3.2/60-pytactl.rules 0000664 0000000 0000000 00000002366 15265502663 0016036 0 ustar 00root root 0000000 0000000 # 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.md 0000664 0000000 0000000 00000034271 15265502663 0014670 0 ustar 00root root 0000000 0000000 # 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.md 0000664 0000000 0000000 00000003316 15265502663 0015304 0 ustar 00root root 0000000 0000000 # 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/LICENSE 0000664 0000000 0000000 00000002706 15265502663 0014062 0 ustar 00root root 0000000 0000000 Copyright (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/Makefile 0000664 0000000 0000000 00000001117 15265502663 0014510 0 ustar 00root root 0000000 0000000 # 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.md 0000664 0000000 0000000 00000031730 15265502663 0014333 0 ustar 00root root 0000000 0000000 # 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.md 0000664 0000000 0000000 00000002367 15265502663 0014651 0 ustar 00root root 0000000 0000000 How 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.py 0000664 0000000 0000000 00000000703 15265502663 0014700 0 ustar 00root root 0000000 0000000 # 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.toml 0000664 0000000 0000000 00000005612 15265502663 0015770 0 ustar 00root root 0000000 0000000 # 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/ 0000775 0000000 0000000 00000000000 15265502663 0014530 5 ustar 00root root 0000000 0000000 pytactl-3.2/pytactl/__init__.py 0000664 0000000 0000000 00000005044 15265502663 0016644 0 ustar 00root root 0000000 0000000 # 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.py 0000664 0000000 0000000 00000030357 15265502663 0015661 0 ustar 00root root 0000000 0000000 #!/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.py 0000664 0000000 0000000 00000117252 15265502663 0017210 0 ustar 00root root 0000000 0000000 # 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.py 0000664 0000000 0000000 00000017354 15265502663 0020133 0 ustar 00root root 0000000 0000000 # 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.py 0000775 0000000 0000000 00000007301 15265502663 0016546 0 ustar 00root root 0000000 0000000 #!/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.py 0000664 0000000 0000000 00000005321 15265502663 0016212 0 ustar 00root root 0000000 0000000 # 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/ 0000775 0000000 0000000 00000000000 15265502663 0017007 5 ustar 00root root 0000000 0000000 pytactl-3.2/pytactl/tac_configs/README.md 0000664 0000000 0000000 00000007602 15265502663 0020273 0 ustar 00root root 0000000 0000000 # 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.json 0000664 0000000 0000000 00000016451 15265502663 0022746 0 ustar 00root root 0000000 0000000 {
"$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.json 0000664 0000000 0000000 00000014553 15265502663 0022751 0 ustar 00root root 0000000 0000000 {
"$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.json 0000664 0000000 0000000 00000024500 15265502663 0022743 0 ustar 00root root 0000000 0000000 {
"$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.json 0000664 0000000 0000000 00000030772 15265502663 0022755 0 ustar 00root root 0000000 0000000 {
"$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.json 0000664 0000000 0000000 00000027350 15265502663 0022754 0 ustar 00root root 0000000 0000000 {
"$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.json 0000664 0000000 0000000 00000026050 15265502663 0022740 0 ustar 00root root 0000000 0000000 {
"$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.json 0000664 0000000 0000000 00000026774 15265502663 0022756 0 ustar 00root root 0000000 0000000 {
"$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.json 0000664 0000000 0000000 00000026002 15265502663 0022737 0 ustar 00root root 0000000 0000000 {
"$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.json 0000664 0000000 0000000 00000026014 15265502663 0022743 0 ustar 00root root 0000000 0000000 {
"$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.json 0000664 0000000 0000000 00000024703 15265502663 0022750 0 ustar 00root root 0000000 0000000 {
"$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.json 0000664 0000000 0000000 00000026400 15265502663 0022745 0 ustar 00root root 0000000 0000000 {
"$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.json 0000664 0000000 0000000 00000026006 15265502663 0022750 0 ustar 00root root 0000000 0000000 {
"$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.json 0000664 0000000 0000000 00000026364 15265502663 0022760 0 ustar 00root root 0000000 0000000 {
"$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.json 0000664 0000000 0000000 00000017711 15265502663 0022755 0 ustar 00root root 0000000 0000000 {
"$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.json 0000664 0000000 0000000 00000023100 15265502663 0022732 0 ustar 00root root 0000000 0000000 {
"$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.json 0000664 0000000 0000000 00000027131 15265502663 0022744 0 ustar 00root root 0000000 0000000 {
"$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.json 0000664 0000000 0000000 00000024337 15265502663 0022752 0 ustar 00root root 0000000 0000000 {
"$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.json 0000664 0000000 0000000 00000026430 15265502663 0022751 0 ustar 00root root 0000000 0000000 {
"$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.json 0000664 0000000 0000000 00000024772 15265502663 0022761 0 ustar 00root root 0000000 0000000 {
"$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.json 0000664 0000000 0000000 00000025417 15265502663 0022757 0 ustar 00root root 0000000 0000000 {
"$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.json 0000664 0000000 0000000 00000025015 15265502663 0022752 0 ustar 00root root 0000000 0000000 {
"$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.json 0000664 0000000 0000000 00000025421 15265502663 0022743 0 ustar 00root root 0000000 0000000 {
"$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.json 0000664 0000000 0000000 00000026654 15265502663 0022755 0 ustar 00root root 0000000 0000000 {
"$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.json 0000664 0000000 0000000 00000016526 15265502663 0022753 0 ustar 00root root 0000000 0000000 {
"$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.json 0000664 0000000 0000000 00000023505 15265502663 0022751 0 ustar 00root root 0000000 0000000 {
"$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.json 0000664 0000000 0000000 00000027215 15265502663 0022756 0 ustar 00root root 0000000 0000000 {
"$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.json 0000664 0000000 0000000 00000026444 15265502663 0022762 0 ustar 00root root 0000000 0000000 {
"$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.json 0000664 0000000 0000000 00000026462 15265502663 0022753 0 ustar 00root root 0000000 0000000 {
"$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.json 0000664 0000000 0000000 00000026512 15265502663 0022750 0 ustar 00root root 0000000 0000000 {
"$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.json 0000664 0000000 0000000 00000026421 15265502663 0022752 0 ustar 00root root 0000000 0000000 {
"$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.json 0000664 0000000 0000000 00000026031 15265502663 0022750 0 ustar 00root root 0000000 0000000 {
"$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.json 0000664 0000000 0000000 00000024232 15265502663 0022744 0 ustar 00root root 0000000 0000000 {
"$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.json 0000664 0000000 0000000 00000025413 15265502663 0022751 0 ustar 00root root 0000000 0000000 {
"$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.json 0000664 0000000 0000000 00000026414 15265502663 0022754 0 ustar 00root root 0000000 0000000 {
"$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.json 0000664 0000000 0000000 00000017760 15265502663 0022761 0 ustar 00root root 0000000 0000000 {
"$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.json 0000664 0000000 0000000 00000027524 15265502663 0022762 0 ustar 00root root 0000000 0000000 {
"$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.json 0000664 0000000 0000000 00000026463 15265502663 0022765 0 ustar 00root root 0000000 0000000 {
"$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.json 0000664 0000000 0000000 00000025372 15265502663 0022753 0 ustar 00root root 0000000 0000000 {
"$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.json 0000664 0000000 0000000 00000025015 15265502663 0022746 0 ustar 00root root 0000000 0000000 {
"$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.json 0000664 0000000 0000000 00000025776 15265502663 0022765 0 ustar 00root root 0000000 0000000 {
"$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.json 0000664 0000000 0000000 00000017704 15265502663 0022756 0 ustar 00root root 0000000 0000000 {
"$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.json 0000664 0000000 0000000 00000027074 15265502663 0022763 0 ustar 00root root 0000000 0000000 {
"$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.json 0000664 0000000 0000000 00000025401 15265502663 0022754 0 ustar 00root root 0000000 0000000 {
"$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.json 0000664 0000000 0000000 00000016374 15265502663 0024075 0 ustar 00root root 0000000 0000000 {
"$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.json 0000664 0000000 0000000 00000016402 15265502663 0024065 0 ustar 00root root 0000000 0000000 {
"$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.json 0000664 0000000 0000000 00000016744 15265502663 0024102 0 ustar 00root root 0000000 0000000 {
"$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.json 0000664 0000000 0000000 00000015736 15265502663 0022772 0 ustar 00root root 0000000 0000000 {
"$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.json 0000664 0000000 0000000 00000014665 15265502663 0022775 0 ustar 00root root 0000000 0000000 {
"$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.json 0000664 0000000 0000000 00000015445 15265502663 0022770 0 ustar 00root root 0000000 0000000 {
"$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.json 0000664 0000000 0000000 00000016502 15265502663 0022761 0 ustar 00root root 0000000 0000000 {
"$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.json 0000664 0000000 0000000 00000016710 15265502663 0022766 0 ustar 00root root 0000000 0000000 {
"$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.json 0000664 0000000 0000000 00000015211 15265502663 0022761 0 ustar 00root root 0000000 0000000 {
"$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.json 0000664 0000000 0000000 00000016303 15265502663 0022770 0 ustar 00root root 0000000 0000000 {
"$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.json 0000664 0000000 0000000 00000020534 15265502663 0022771 0 ustar 00root root 0000000 0000000 {
"$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.json 0000664 0000000 0000000 00000016425 15265502663 0022710 0 ustar 00root root 0000000 0000000 {
"$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.json 0000664 0000000 0000000 00000017332 15265502663 0022772 0 ustar 00root root 0000000 0000000 {
"$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.json 0000664 0000000 0000000 00000020336 15265502663 0022767 0 ustar 00root root 0000000 0000000 {
"$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.json 0000664 0000000 0000000 00000020347 15265502663 0022776 0 ustar 00root root 0000000 0000000 {
"$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.json 0000664 0000000 0000000 00000063311 15265502663 0022041 0 ustar 00root root 0000000 0000000 {
"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.py 0000664 0000000 0000000 00000060466 15265502663 0017053 0 ustar 00root root 0000000 0000000 # 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/ 0000775 0000000 0000000 00000000000 15265502663 0014537 5 ustar 00root root 0000000 0000000 pytactl-3.2/scripts/known-config-differences.json 0000664 0000000 0000000 00000003314 15265502663 0022305 0 ustar 00root root 0000000 0000000 {
"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.py 0000664 0000000 0000000 00000043204 15265502663 0021520 0 ustar 00root root 0000000 0000000 # 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/ 0000775 0000000 0000000 00000000000 15265502663 0014212 5 ustar 00root root 0000000 0000000 pytactl-3.2/tests/README.md 0000664 0000000 0000000 00000024764 15265502663 0015506 0 ustar 00root root 0000000 0000000 # 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.py 0000664 0000000 0000000 00000042714 15265502663 0016421 0 ustar 00root root 0000000 0000000 # 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.py 0000664 0000000 0000000 00000014662 15265502663 0020576 0 ustar 00root root 0000000 0000000 # 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.py 0000664 0000000 0000000 00000022167 15265502663 0020245 0 ustar 00root root 0000000 0000000 # 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.py 0000664 0000000 0000000 00000020462 15265502663 0020656 0 ustar 00root root 0000000 0000000 # 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.py 0000664 0000000 0000000 00000004426 15265502663 0016747 0 ustar 00root root 0000000 0000000 # 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.py 0000664 0000000 0000000 00000112710 15265502663 0017562 0 ustar 00root root 0000000 0000000 # 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"] == []