Files
e6d8822517 Add TP-Link Kasa KC110 (HI3518EV200 + OV2735) (#99)
* Add TP-Link Kasa KC110 (HI3518EV200 + OV2735)

New device variant: hi3518ev200_ultimate_tplink-kasa-kc110.

Contents:
- kc110-board-support package: PTZ binary (mmap'd PL061), gpio-motors
  shim for the openipc web GUI, IR control script, and a boot-time
  pinmux init that writes 0x1 to the chip7/chip8 pads (0x200f00e8/ec/
  f0/fc/100/104). The OpenIPC kernel pinctrl driver does not auto-set
  these for the KC110's pan motor / IR-cut / IR-LED pads — the vendor
  firmware writes them explicitly in hn_config.sh. Without this,
  PL061 GPIODATA writes succeed silently but the pads never drive
  the ULN2803 / solenoid / LED.
- Device overlay:
    * etc/sensors/ov2735_i2c_1080p.ini — input_mode=0 (MIPI), 1-lane
      (was input_mode=4 / 4-lane in upstream cv200 osdrv, which is
      wrong for OV2735).
    * usr/bin/load_hisilicon — adds an "ov2735" case that mirrors
      ov2710_mipi (same MIPI pinmux + clock).
    * usr/share/openipc/customizer.sh — first-boot configuration:
      RTL8188FU wlandev, sensor config path, IR-cut pin 64, backlight
      pin 63, lightMonitor true (AE recovery after IR-cut toggle).
- README.md row.

Hardware notes:
- SoC: Hi3518EV200; Sensor: OV2735 (MIPI 1-lane, RAW10);
  Wi-Fi: RTL8188FU (USB); Flash: W25Q128 16 MB NOR.
- PTZ: 4-phase unipolar steppers via ULN2803 darlington array.
  Pan = vendor base-10 GPIO 81/74/73/72 = OpenIPC PL061 65/60/59/58;
  tilt = 0/1/2/44 = 0/1/2/36 (vendor's "44" is bank 4 pin 4 — i.e.
  pin 36 in OpenIPC's PL061 numbering, NOT 44).
- IR-cut filter: GPIO 64 (vendor 80) active-low; IR-LED: GPIO 63
  (vendor 77).

Status: PTZ + GPIO + IR fully functional. Video pipeline currently
needs an LD_PRELOAD shim around HI_MIPI_SET_DEV_ATTR because upstream
majestic builds combo_dev_attr_t with enIntfMode=DC / raw_data_type=0
for MIPI sensors that need RAW10. The shim is downstream-only pending
a real fix to majestic upstream; this PR delivers the rest of the
KC110 board support and will produce a fully-functional camera once
the majestic fix lands.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

* tplink-kasa-kc110: use ov2735_mipi_1080p.ini

Follow OpenIPC/firmware #2155, which ships the OV2735 MIPI config as a
separate ov2735_mipi_1080p.ini and leaves ov2735_i2c_1080p.ini (the
parallel/DVP config) untouched.

- Rename the device's bundled sensor .ini to ov2735_mipi_1080p.ini and
  carry the full corrected MIPI config: input_mode=0 (MIPI),
  data_type=2 (RAW10), lane_id 2-lane, Input_mod=5 (MIPI),
  Mask_0=0xFFF00000. The previous bundled copy only had input_mode
  fixed (data_type/Input_mod/Mask_0 were still the wrong DVP defaults).
- Point customizer.sh's isp.sensorConfig at the new file.
- Exclude the unused parallel ov2735_i2c_1080p.ini from the image.

Verified on a TP-Link Kasa KC110 (OV2735 2-lane MIPI RAW10): clean
image, correct AE, RTSP H.264 1080p.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

---------

Co-authored-by: moontwister <moontwister@users.noreply.github.com>
Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
2026-06-13 22:37:11 +03:00
..

kc110-board-support

Buildroot package providing KC110-specific hardware support for OpenIPC. Delivers:

File Purpose
/usr/bin/ptz C binary (mmap PL061) for pan/tilt + IR-cut + IR-LED via vendor-base-10 GPIO numbering
/usr/bin/gpio-motors 451-byte shell shim that forwards calls to ptz pan/tilt (web-GUI compatible)
/usr/bin/ir-control.sh Wrapper for IR-LED + IR-cut filter control
/etc/init.d/S94pinmux-pan-ir Boot-time init that writes 0x1 to pinmux registers 0x200f00e8/ec/f0/fc/100/104 (KC110 chip7/8 pads)

Layout

kc110-board-support/
├── Config.in              # BR2_PACKAGE_KC110_BOARD_SUPPORT
├── kc110-board-support.mk # generic-package build + install rules
├── src/                   # source tree (compiled with target toolchain)
│   ├── Makefile
│   └── ptz.c              # ARM-static-stripped via cross-compile
└── files/                 # installed as-is (no build step)
    ├── etc/init.d/S94pinmux-pan-ir
    └── usr/bin/{gpio-motors,ir-control.sh}

Use from upstream openipc-firmware

The package lives at the repo root (kc110-board-support/) but must be discoverable by Buildroot inside the upstream tree via a symlink:

openipc/openipc-firmware/general/package/kc110-board-support → ../../../../kc110-board-support

The symlink is reconstructed by the setup step (below).

Setup after git pull of upstream

Because openipc/ is gitignored, the wire-in edits in the upstream tree are lost on each pull. Re-apply them from patches/openipc-wire-in-kc110.patch:

cd openipc/openipc-firmware
git apply ../../patches/openipc-wire-in-kc110.patch

# Re-create the symlink if it disappeared:
[ -L general/package/kc110-board-support ] || \
  ln -s ../../../../kc110-board-support general/package/kc110-board-support

The patch adds:

  • A source statement for the package in general/package/Config.in
  • BR2_PACKAGE_KC110_BOARD_SUPPORT=y to hi3518ev200_ultimate_defconfig and removes BR2_PACKAGE_GPIO_MOTORS=y (our shim replaces upstream's gpio-motors binary)

Build

Picked up automatically by BOARD=hi3518ev200_ultimate make all once the wire-in is applied. The ptz binary builds reproducibly — md5 e70f78d73c91248ba044082e3f21c54b across rebuilds.

Conflict with upstream gpio-motors

BR2_PACKAGE_GPIO_MOTORS (upstream) and BR2_PACKAGE_KC110_BOARD_SUPPORT both install /usr/bin/gpio-motors and cannot be enabled simultaneously. The wire-in patch removes BR2_PACKAGE_GPIO_MOTORS=y from the defconfig to avoid the collision.