{"id":50980004,"url":"https://github.com/qualcomm/pytac","last_synced_at":"2026-06-19T13:02:04.736Z","repository":{"id":360725568,"uuid":"1242433732","full_name":"qualcomm/pytac","owner":"qualcomm","description":null,"archived":false,"fork":false,"pushed_at":"2026-06-10T16:11:49.000Z","size":55,"stargazers_count":2,"open_issues_count":0,"forks_count":3,"subscribers_count":2,"default_branch":"main","last_synced_at":"2026-06-10T18:07:21.501Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"bsd-3-clause","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/qualcomm.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-05-18T12:26:56.000Z","updated_at":"2026-06-10T16:17:12.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/qualcomm/pytac","commit_stats":null,"previous_names":["qualcomm/pytac"],"tags_count":2,"template":false,"template_full_name":null,"purl":"pkg:github/qualcomm/pytac","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/qualcomm%2Fpytac","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/qualcomm%2Fpytac/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/qualcomm%2Fpytac/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/qualcomm%2Fpytac/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/qualcomm","download_url":"https://codeload.github.com/qualcomm/pytac/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/qualcomm%2Fpytac/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34532260,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-19T02:00:06.005Z","response_time":61,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-06-19T13:02:01.115Z","updated_at":"2026-06-19T13:02:04.727Z","avatar_url":"https://github.com/qualcomm.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# PyTAC\n\nPython implementation of Test Automation Controller (TAC/Alpaca) for controlling Qualcomm debug boards.\nIt uses config files and PSOC firmware from the original TAC (Alpaca) system.\n\n# Installation\n\n    virtualenv -p python3 venv\n    . ./venv/bin/activate\n    pip install -r requirements.txt\n\n## USB permissions\n\nBy default, USB devices are not accessible without root. Create a udev rule for your board:\n\n    echo 'SUBSYSTEM==\"usb\", ATTR{idVendor}==\"05c6\", ATTR{idProduct}==\"9302\", MODE=\"0666\", GROUP=\"plugdev\"' \\\n      | sudo tee /etc/udev/rules.d/99-alpaca.rules\n    sudo udevadm control --reload-rules \u0026\u0026 sudo udevadm trigger\n\nThen make sure your user is in the `plugdev` group (log out and back in after):\n\n    sudo usermod -aG plugdev $USER\n\n# Configuration\n\nPyTAC requires board configuration files in a `tac_configs/` directory (default: `./tac_configs`),\nwhich can be copied from [qcom-test-automation-controller](https://github.com/qualcomm/qcom-test-automation-controller/tree/main/configurations) project.\n\n`devicelist.json` maps board hardware IDs to their `.tcnf` config files. Example entry for a PSOC board:\n\n    {\n      \"catalog\": [\n        {\n          \"platform_id\": 17,\n          \"configPath\": \"tac_configs/TAC_PSOC_17.tcnf\"\n        }\n      ]\n    }\n\n## Finding your board's serial number\n\nThe `--serial` argument takes the USB serial number, not a device path. Find it with:\n\n    udevadm info /dev/ttyACM0 | grep ID_SERIAL_SHORT\n\nOr using `lsusb` (replace `VID:PID` with `0403:6011` for FTDI or `05c6:9302` for PSOC):\n\n    lsusb -v -d VID:PID | grep iSerial\n\n# Using as a shell\n\n    python3 shell.py --serial \u003cID_SERIAL_SHORT\u003e\n\nOptional arguments:\n\n    --tac-config-path ./tac_configs   # path to config directory (default: ./tac_configs)\n    --log-level DEBUG                 # log verbosity (default: DEBUG)\n\nOnce 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:\n\n**Power control:**\n\n    powerOn\n    powerOff\n    devicePowerOn\n    devicePowerOff\n    usbDevicePowerOn\n    usbDevicePowerOff\n\n**Boot modes:**\n\n    bootToEDL\n    bootToFastboot\n    bootToUEFI\n    reset\n\n**GPIO pins** (use with `1` to assert, `0` to deassert):\n\n    pkey 1      # press power key\n    pkey 0      # release power key\n    volup 1\n    voldn 1\n\nType `help` in the shell to list all commands available for your specific board.\n\n# Using as a service\n\n    python3 rest.py --serial \u003cID_SERIAL_SHORT_1\u003e [\u003cID_SERIAL_SHORT_2\u003e ...]\n\nThe REST API runs on `http://localhost:5000`. Example usage with curl:\n\n    # List connected boards\n    curl http://localhost:5000/\n\n    # List available quick methods (bootToEDL, powerOn, etc.)\n    curl http://localhost:5000/\u003cboardid\u003e/quick\n\n    # Power on/off\n    curl -X PUT http://localhost:5000/\u003cboardid\u003e/quick/powerOn\n    curl -X PUT http://localhost:5000/\u003cboardid\u003e/quick/powerOff\n\n    # Boot to EDL\n    curl -X PUT http://localhost:5000/\u003cboardid\u003e/quick/bootToEDL\n\n    # Boot to fastboot\n    curl -X PUT http://localhost:5000/\u003cboardid\u003e/quick/bootToFastboot\n\n    # Set a named pin\n    curl -X PUT \"http://localhost:5000/\u003cboardid\u003e/command/reset?value=1\"\n\n    # Set a raw pin (e.g., bus A, pin 0)\n    curl -X PUT \"http://localhost:5000/\u003cboardid\u003e/pin/A0?value=1\"\n\nNote: REST API server runs in debug mode. Running with multiple concurrent threads may lead to unexpected behaviour.\n\n# License\n\npytac is licensed under the [BSD-3-clause License](https://spdx.org/licenses/BSD-3-Clause.html). See [LICENSE](LICENSE) for the full license text.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fqualcomm%2Fpytac","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fqualcomm%2Fpytac","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fqualcomm%2Fpytac/lists"}