tplink-kasa-kc110: ship vendor OV2735 libsns (fixes no video), ultimate majestic - #108
Conversation
0816188 to
a099b8f
Compare
|
Thanks for this, and sorry it sat. Three changes are bundled here and they've diverged in status. The CI registration — the The other two changes are untouched by any of that and still wanted:
Could you drop the One thing while you're in there: please also drop |
Step 6 of "Adding a new device" still says to add `- <device>` to the matrix in .github/workflows/master.yml, and calls that matrix "the *only* build registry". Neither has been true since #120 moved the matrix into .github/scripts/ci-matrix.py, where it is derived from the tree rather than listed. master.yml now has no device list at all. This is not a hypothetical staleness. Two of the pull requests open right now do exactly what step 6 says: #111 (Tapo TC70 v3) and #108 (KC110) each append a line to a block that no longer exists, so both are merge conflicts rather than the one-line changes they were written as. Their authors did the documented thing. So step 6 is now the opposite instruction -- there is nothing to add, and adding it is the mistake. It also names NOT_BUILT, since that is the one list a contributor could reasonably go looking for, and says to leave it alone. Two adjacent claims went stale with the same change and are fixed here: the master.yml bullet described a cron-and-dispatch workflow with no pull_request trigger, and nothing in the file mentioned ci-matrix.py at all -- including that --self-test runs in the Select devices job and will fail a PR that puts the tree and the selector out of step. Step 8 no longer says "locally" as though that were the only way a device gets built.
) Step 6 of "Adding a new device" still said to add `- <device>` to the matrix in .github/workflows/master.yml, and called that matrix "the *only* build registry". Neither has been true since #120 moved the matrix into .github/scripts/ci-matrix.py, where it is derived from the tree rather than listed. master.yml has no device list at all. Not a hypothetical staleness: #111 (Tapo TC70 v3) and #108 (KC110) each append a line to a block that no longer exists, so both are merge conflicts rather than the one-line changes they were written as. Their authors did the documented thing. So step 6 is now the opposite instruction -- there is nothing to add, and adding it is the mistake. It also names NOT_BUILT, since that is the one list a contributor could reasonably go looking for, and says to leave it alone. Two adjacent claims went stale with the same change: the master.yml bullet described a cron-and-dispatch workflow with no pull_request trigger, and nothing mentioned ci-matrix.py at all -- including that --self-test runs in the Select devices job and will fail a PR that puts the tree and the selector out of step. A second correction, caught by Qodo in review: "opening the PR is what gets the device built" holds only for a non-draft PR. classify() returns needs_build=False for a draft and self_test() asserts it; master.yml lists ready_for_review in its triggers precisely because a PR opened as a draft would otherwise never build once marked ready. Left as written, a contributor could open a draft, see no build, and read that as the device being fine. The ci:full label is documented for the same reason -- it is the other contributor-facing lever over the matrix.
The device defconfig set BR2_OPENIPC_VARIANT="ultimate" but omitted BR2_OPENIPC_MAJESTIC, so it fell back to the "lite" default (general/Config.in). All stock *_ultimate firmware defconfigs set BR2_OPENIPC_MAJESTIC="ultimate"; this aligns the device with its declared variant. Note: this is a variant-consistency fix, NOT a fix for the no-video problem. On-hardware testing (hi3518ev200 + OV2735) showed the device produces no video with BOTH the lite and the ultimate majestic — the sensor i2c writes abort, so the OV2735 never streams. The majestic variant is therefore not the cause; that issue is separate and not addressed here. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
OpenIPC's opensdk libsns_ov2735.so does not drive the OV2735 on this board: the sensor i2c init aborts and the sensor never streams (MIPI detects no valid frame, VENC never encodes, /image.jpg hangs). This was isolated and hardware-proven by a bidirectional, single-variable swap on the live camera: with opensdk's libsns -> no video; swapping in the vendor libsns -> instant 1080p (verified against both firmware HEAD and the 2026-06-17 release, so it is the sole cause, independent of the kernel/opensdk version). Ship the vendor libsns_ov2735.so as a device-overlay payload (the documented pattern for a sensor lib the SoC osdrv does not correctly provide). It loads cleanly against OpenIPC's libisp / lib_hiae, so no other files are needed. Scoped to this device's overlay -> cannot affect other boards. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
e261134 to
c6a15e9
Compare
Both devices have had a complete devices/<dir>/ in this tree for a long time and had never once been built. #120 froze that state rather than changing it -- it put the 7 defconfigs that were in no master.yml matrix into NOT_BUILT so that a device falling out of CI would be a test failure instead of a silent skip. Freezing was right for a change whose job was to not alter what gets built; it was never meant to be permanent for devices whose only problem is that nobody added the matrix line. Two contributors did try to add that line. #111 (Tapo TC70 v3, July) and #108 (KC110, June) both append to the device list in master.yml, which is where the registry lived when they were written. It does not live there any more -- the matrix is read off the tree -- so both PRs are merge conflicts now, and the devices they asked for are exactly the two entries removed here. This is their CI half, landed the way the selector wants it. #108 also carries a BR2_OPENIPC_MAJESTIC="ultimate" line and a vendor libsns_ov2735.so for the no-video bug; those are unaffected and stay with that PR. The two self-test cases that used t31_lite_tp-link-tapo-tc70-v3 as their example of an unbuilt device move to t31_lite_xiaomi-mjsxj05hl, which is still in NOT_BUILT. The overlay case also switches to a path that exists, since the device it now names has no etc/inittab. Neither device had ever been through a build, so this PR was where we found out. That was affordable exactly once: a change to ci-matrix.py cannot narrow -- it is what does the narrowing -- so this ran the full matrix and proved both in the same run. Both are green: Firmware (hi3518ev200_ultimate_tplink-kasa-kc110) SUCCESS Firmware (t31_lite_tp-link-tapo-tc70-v3) SUCCESS
|
Thanks — this is exactly what was asked for. The What I could verify statically, against master:
One thing worth recording in the commit message rather than changing:
That is the right call for the fix, but it does pin this device to the vendor blob permanently: if firmware ever updates its own To actually build it, a maintainer needs to approve the workflow run. The run is sitting at Nothing here blocks merging on my side beyond seeing it build. |
|
Heads-up on a false green, and a bit of noise incoming — nothing you need to do. I approved the workflow run, and it came back green, but it did not actually build anything: That is a timing artifact, not a problem with your branch. The run was created at 18:10, and #132 — the PR that takes the KC110 out of Reopening the PR to force a fresh evaluation against current master ( |
PR Summary by QodoRestore KC110 video with vendor OV2735 library and ultimate Majestic
AI Description
Diagram
High-Level Assessment
Files changed (2)
|
Code Review by Qodo🐞 Bugs (0) 📘 Rule violations (0) 📎 Requirement gaps (0)
Great, no issues found!Qodo reviewed your code and found no material issues that require reviewTip of the day💡 Did you know, you can ask Qodo to dismiss a finding you disagree with, with your reason on record |
|
One more close/reopen notification from me, sorry — last one. Explaining so the churn on your PR makes sense. My first attempt to re-trigger this raced GitHub: when I reopened at 18:58, I then assumed re-running the workflow would pick up the newer base. It does not — a re-run pins the merge commit computed when the run was first created, so attempt 3 checked out the identical The merge ref has since been recomputed to Your branch has not been touched at any point. |
|
Code review by qodo was updated up to the latest commit c6a15e9 |
|
Built, and properly this time. Run 33106540798 checked out the right base: Fit is a non-issue on this board: and no entry in Note the earlier So: the defconfig change and the overlay compile and fit. What CI cannot tell us is whether the vendor blob actually fixes the no-video symptom — that needs the camera. If you have flashed this image on the KC110 and have video, say so on the PR and that is good enough for me. Still useful whenever you get to it: which stock TP-Link firmware image and version the |
|
Merged as 2ca0796 — and an apology for the runaround at the end. I told you "nothing here blocks merging on my side beyond seeing it build", it built, and I then asked for hardware confirmation and the blob's provenance before merging. That was moving the goalposts after you had already done everything asked, and it was the wrong call. The bar I stated was the bar. The provenance question stands only as a nice-to-have: if you happen to remember which stock TP-Link image the Thanks for coming back to a PR that had sat since June, and for splitting it cleanly when asked. |
Two changes to the KC110 device profile added in #99, so the device produces video once CI builds it. The built image was hardware-verified on a KC110 (streams 1080p out-of-the-box).
The CI-registration half of this PR is dropped: the matrix has been derived from the tree since #120, and the KC110's
NOT_BUILTopt-out is removed by #132 instead.BR2_PACKAGE_JSONFILTER=yneeded no change here — #128 had already removed it from this defconfig, so the rebase inherited that.1. Ship the vendor OV2735 libsns — fixes no video
OpenIPC's opensdk
libsns_ov2735.sodoes not drive this OV2735: the sensor i2c init aborts (hi_i2c_wait_txfifo_notfull/hi_i2c_abortprocess) and the sensor never streams — MIPI detects no valid frame, VENC stays idle,/image.jpghangs.This ships the vendor
libsns_ov2735.so(from the device's stock firmware, same provenance as the rest of the HiSilicon stack) as a device-overlay payload — the documented pattern for a sensor lib the SoC osdrv doesn't correctly provide. It loads cleanly against OpenIPC'slibisp/lib_hiae, so no other files are needed, and it is scoped to this device's overlay (cannot affect other boards).Hardware-proven by a bidirectional, single-variable swap on a live KC110: opensdk libsns → no video; vendor libsns → instant 1080p — on both firmware HEAD and the 2026-06-17 release.
2. Select the
ultimatemajestic variant (consistency)The defconfig sets
BR2_OPENIPC_VARIANT="ultimate"but omittedBR2_OPENIPC_MAJESTIC, so it fell back to thelitedefault (general/Config.in). This aligns the device with its declared variant, matching the two other devices that set it (bothhi3516ev300_ultimate_*).Device builds clean (rootfs 6440 KB / 8192 KB NOR).