{"id":48801241,"url":"https://github.com/opensensor/open-tx-isp","last_synced_at":"2026-04-14T03:01:42.312Z","repository":{"id":262049187,"uuid":"885694515","full_name":"opensensor/open-tx-isp","owner":"opensensor","description":"An Open Source T-series ISP driver (t31x working stream)","archived":false,"fork":false,"pushed_at":"2026-04-06T06:29:06.000Z","size":46738,"stargazers_count":10,"open_issues_count":0,"forks_count":2,"subscribers_count":4,"default_branch":"main","last_synced_at":"2026-04-06T07:33:51.534Z","etag":null,"topics":["camera-control","isp"],"latest_commit_sha":null,"homepage":"","language":"C","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/opensensor.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"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":"2024-11-09T06:19:40.000Z","updated_at":"2026-04-06T03:33:38.000Z","dependencies_parsed_at":"2024-11-10T07:22:42.691Z","dependency_job_id":"c4b3bd63-bafb-49d5-8b60-eb4eaae5e069","html_url":"https://github.com/opensensor/open-tx-isp","commit_stats":null,"previous_names":["opensensor/isp","opensensor/open-tx-isp"],"tags_count":16,"template":false,"template_full_name":null,"purl":"pkg:github/opensensor/open-tx-isp","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/opensensor%2Fopen-tx-isp","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/opensensor%2Fopen-tx-isp/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/opensensor%2Fopen-tx-isp/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/opensensor%2Fopen-tx-isp/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/opensensor","download_url":"https://codeload.github.com/opensensor/open-tx-isp/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/opensensor%2Fopen-tx-isp/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31779947,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-14T02:24:21.117Z","status":"ssl_error","status_checked_at":"2026-04-14T02:24:20.627Z","response_time":153,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"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":["camera-control","isp"],"created_at":"2026-04-14T03:01:41.434Z","updated_at":"2026-04-14T03:01:42.307Z","avatar_url":"https://github.com/opensensor.png","language":"C","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Open-Source ISP Driver for Ingenic T31\n\n![Ingenic ISP Logo](./ingenic_isp.webp)\n\n## Overview\n\nThis repository contains an open-source reimplementation of the Ingenic T31 ISP kernel driver (`tx-isp-t31.ko`) used on devices such as the Wyze Cam 3 and other T31-based cameras.\n\nThe project goal is **behavioral equivalence with the OEM driver**, so Ingenic's proprietary user-space library `libimp.so` can run unmodified against the open-source driver.\n\nThis is not a greenfield camera pipeline. It is a reverse-engineering and compatibility effort that combines:\n\n- open-source kernel-driver development\n- OEM binary analysis\n- `libimp.so` ABI compatibility work\n- image-quality tuning and calibration recovery\n\n## Current Status\n\nThe project has moved well beyond initial bring-up.\n\n### Working today\n\n- kernel module architecture is in place\n- major ISP subdevices exist and probe\n- core MMIO mapping and IRQ ownership are understood\n- stream bring-up is functional enough for live video\n- tuning infrastructure and many ISP blocks are implemented\n- reverse-engineered architecture and tuning docs now exist in-tree\n\n### Still incomplete\n\n- image quality is **not yet OEM-equivalent**\n- the current main visible issue is false-color / green-magenta blob artifacts\n- some tuning tables are still synthetic or only partially reconstructed\n- several ISP blocks need additional parity work or better OEM-derived data\n\nIf you want the detailed status and finish plan, start with `docs/IMAGE_TUNING_PRD.md`.\n\n## Key Documentation\n\n- [`docs/T31_ISP_ARCHITECTURE.md`](docs/T31_ISP_ARCHITECTURE.md) — current hardware / driver architecture notes\n- [`docs/IMAGE_TUNING_PRD.md`](docs/IMAGE_TUNING_PRD.md) — plan for finishing image tuning and remaining work\n- [`driver/REGMAP_ADR_YDNS.md`](driver/REGMAP_ADR_YDNS.md) — ADR / YDNS register-map notes\n- [`driver/TX_ISP_VIDEO_S_STREAM_VERIFIED.md`](driver/TX_ISP_VIDEO_S_STREAM_VERIFIED.md) — stream-control verification notes\n- [`external/ingenic-sdk/3.10/isp/t31/OEM_TUNING_BLOB_MANIFEST.md`](external/ingenic-sdk/3.10/isp/t31/OEM_TUNING_BLOB_MANIFEST.md) — current map of recovered vs synthetic tuning data\n\n## Repository Layout\n\n| Path | Purpose |\n|---|---|\n| `driver/` | Open-source T31 ISP kernel-driver implementation |\n| `driver/include/` | Shared headers and data structures |\n| `external/ingenic-sdk/` | Sensor and SDK reference material |\n| `docs/` | High-level project documentation and planning |\n| `OEM-tx-isp-t31.ko` | OEM reference kernel module |\n\nImportant driver files:\n\n- `driver/tx-isp-module.c` — module init/exit, platform resources, shared register helpers\n- `driver/tx_isp_core.c` — core probe, memory mappings, ISR path, first-frame logic\n- `driver/tx_isp_tuning.c` — tuning subsystem, per-block init, parameter handling, image pipeline control\n- `driver/tx_isp_csi.c` / `driver/tx_isp_vic.c` / `driver/tx_isp_vin.c` / `driver/tx_isp_fs.c` — CSI/VIC/VIN/frame-source subdevices\n\n## Project Goals\n\n1. Replace the proprietary ISP kernel driver on T31 devices\n2. Preserve compatibility with Ingenic's `libimp.so`\n3. Match OEM register sequencing and control behavior closely\n4. Recover or reconstruct enough OEM tuning content for acceptable image quality\n5. Document the hardware and bring-up process so the work is maintainable\n\n## Requirements\n\n- **Target SoC:** Ingenic T31\n- **Kernel focus:** Linux 3.10.14-based vendor trees\n- **Userspace ABI target:** Ingenic `libimp.so`\n- **Sensor support model:** OEM-style sensor drivers and compatible sensor integrations from the Ingenic SDK ecosystem\n\n## Build\n\nTypical cross-compile command for the vendor 3.10.14 kernel environment:\n\n```bash\nmake -C \u003ckernel-src\u003e M=$(pwd)/driver modules ARCH=mips CROSS_COMPILE=mipsel-linux-gnu-\n```\n\nExpected artifact:\n\n- `driver/tx-isp-t31.ko`\n\n## Reverse-Engineering Workflow\n\nThe project works best when changes are driven by evidence, not guesswork.\n\nRecommended workflow:\n\n1. identify the relevant open-source code path in `driver/`\n2. compare against the OEM binary behavior\n3. confirm `libimp.so` expectations when ioctl or struct ABI is involved\n4. make the smallest safe parity change\n5. validate with logs, images, and targeted diffs\n\nThe new architecture and PRD docs capture the current high-level understanding so this work can continue systematically instead of rediscovering the same facts.\n\n## What Makes This Hard\n\nThis project is solving several problems at once:\n\n- hardware bring-up and clock/reset ordering\n- platform/subdevice modeling\n- reverse-engineering OEM register sequences\n- reproducing runtime tuning behavior\n- recovering missing calibration/tuning tables\n\nEven when streaming works, image quality can still be wrong if one of the following is off:\n\n- CFA/demosaic phase\n- block enable/bypass state\n- LUT programming path\n- tuning table contents\n- day/night or WDR bank selection\n\n## Limitations\n\nCurrent limitations are mostly in **image tuning parity**, not basic driver existence.\n\nKnown classes of remaining work include:\n\n- early color-path parity (for example DMSC / GIB / LSC / YDNS interactions)\n- OEM-calibrated table recovery for AE, CCM/BCSH/WB, ADR/WDR, and denoise banks\n- mode-complete validation for day/night, WDR, and sensor flip combinations\n\n## Contributing\n\nContributions are welcome, especially when they are grounded in one of these:\n\n- OEM binary analysis\n- `libimp.so` ABI validation\n- concrete hardware validation logs/captures\n- recovery of tuning/calibration data\n- improvements to documentation and reproducibility\n\nIf you are making behavioral changes, please document:\n\n- what OEM evidence supports the change\n- which files/functions were updated\n- how the change was validated\n- any remaining uncertainty\n\n## Acknowledgments\n\nThanks to the work and prior art from the broader Ingenic / Thingino / Wyze reverse-engineering community, especially:\n\n- [thingino-firmware](https://github.com/themactep/thingino-firmware)\n- [ingenic-sdk](https://github.com/themactep/ingenic-sdk)\n\n## License\n\nThis project is licensed under the GNU General Public License (GPLv3).","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fopensensor%2Fopen-tx-isp","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fopensensor%2Fopen-tx-isp","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fopensensor%2Fopen-tx-isp/lists"}