Skip to content

Add SiS 0x0457/0x0819 multitouch wake-up quirk - #36

Open
brianpeat wants to merge 5 commits into
shueber:mainfrom
brianpeat:sis-multitouch-quirk
Open

Add SiS 0x0457/0x0819 multitouch wake-up quirk#36
brianpeat wants to merge 5 commits into
shueber:mainfrom
brianpeat:sis-multitouch-quirk

Conversation

@brianpeat

Copy link
Copy Markdown

Intro

  • I'm not a developer — I wanted my touchscreen to work and built this with Claude Code. Claude Code also wrote everything after this first note (this first note is all me). I'm submitting this because it works and may help others with the same panel. I got my 14" screen for $49 from MicroCenter, so I suspect there are a LOT of them out there. Claude noted that there are multiple brands using this same panel. Feel free to take what you want from this and completely rewrite it. I am not a coder, you will not hurt my feelings if you gut this and just pull out the important bits. I just want it posted in case it's useful to anyone. Thanks!

What

Adds a small vendor-quirk table in HIDInterpreter.c that sends a one-time HID
SET_REPORT (Feature, report 7, Device Mode = 2 / Device Identifier = 1) from
RegisterTouchDevice() for the SiS 0x0457/0x0819 touch controller, before the input
queue starts.

This is the standard HID "Device Mode" feature control (HID Usage Tables, Digitizers
page 0x0D, usages 0x52/0x53) — the same SET_REPORT that Windows' HID stack and Linux's
hid-multitouch.c (mt_set_input_mode()) issue to take a digitizer out of single-point
mouse-compatibility mode. macOS doesn't send it, so this panel matches Touch Up's
digitizer matching dictionary but never emits multitouch reports until the transfer is
replayed. The report ID and field values are read straight from the panel's own report
descriptor; a USB capture of a working Windows driver for the same panel shows the
identical transfer.

The SiS 0x0457/0x0819 controller is resold under many names (Verbatim PMT-14, UPERFECT,
WIMAXIT, EVICIV, …) all sharing this VID/PID, so one table entry covers the family, and
the table makes more easy to add.

Also included

d1414cd guards against a NULL queue in RegisterTouchDevice(). IOHIDQueueCreate()
returns NULL when the device can't be opened (typically Input Monitoring not granted
yet); the code then dereferenced it and crashed on launch (EXC_BAD_ACCESS in
IOHIDQueueRegisterValueAvailableCallback) instead of falling through to the
permission-request UI. Independent of the quirk — happy to split it out.

Testing

  • Apple Silicon (SIP on): wake-up SET_REPORT returns kIOReturnSuccess; tap / drag /
    hold-drag-select / pinch-zoom all work through the app.
  • Intel x86_64 (SIP off): wake-up fires, same result; gestures work.
  • No changes to multitouch parsing — the panel uses standard digitizer usages the existing
    parser already handles (CountContactCollections() sees 5 finger collections).

Notes

  • Two of the commits (Update .gitignore / Revert local .gitignore entry) cancel out and
    leave no net change; squash-merging drops them.

brianpeat and others added 5 commits August 30, 2026 10:04
This SiS HID touch controller (Verbatim PMT-14, UPERFECT, WIMAXIT,
EVICIV, and other rebrands, all sharing VID/PID 0x0457/0x0819) boots in
single-point mouse-compatibility mode and never emits multitouch reports
until the host sends one HID SET_REPORT (Feature, report 7, payload
0x02 0x01). Add a small vendor-quirk table and replay that transfer from
RegisterTouchDevice() before the input queue starts.

No GET_REPORT is attempted first — this silicon stalls on one (cf. Linux
hid-multitouch HID_QUIRK_NOGET for the same vendor).

Confirmed via USB capture of the Touch-Base UPDD driver and a standalone
IOHIDManager probe: immediately after this SetReport the panel begins
sending 5-contact reports (report ID 0x91). No parser changes are needed
— the report descriptor already advertises 5 contact collections.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
IOHIDQueueCreate returns NULL when the device can't be opened — most
commonly because Input Monitoring has not been granted yet. The existing
code dereferenced the queue unconditionally, so the app crashed on launch
(EXC_BAD_ACCESS in IOHIDQueueRegisterValueAvailableCallback) instead of
falling back to its permission-request UI. Bail cleanly and release the
half-initialized device state.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
The /Notes ignore was a local scratch-folder convenience, not something
for upstream. Restores .gitignore to its previous state.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Rewrites the vendor-quirk comment to lead with the public mechanism it
uses: the "Device Mode" feature control from the HID Usage Tables
(Digitizers page, usages 0x52/0x53), the same SET_REPORT that Windows'
HID stack and Linux's hid-multitouch.c (mt_set_input_mode) issue to take
a digitizer out of mouse-compatibility mode. The report ID and field
values come straight from the panel's own report descriptor; the USB
capture only corroborated an already-standard transfer. No functional
change.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant