1

At work we have a multitouch monitor which apparently is a USB Human Interface Device (HID). It identifies itself as vendor 0x4623 product 0x011a, apparently produced by Beijing Honghe Technology Group but branded Newline. It works out of the box on Linux (apparently using a generic HID multitouch driver), but not on OS X. system_profiler describes it like this:

o HHTTOUCH@14110000  <class IOUSBHostDevice, id 0x100008953, registered, matched, active, busy 0 (731 ms), retain 30>
| {
|   "USBPortType" = 0x0
|   "sessionID" = 0x180f680965f78
|   "USB Vendor Name" = "HongHeTouch"
|   "IOCFPlugInTypes" = {"9dc7b780-9ec0-11d4-a54f-000a27052861"="IOUSBFamily.kext/Contents/PlugIns/IOUSBLib.bundle"}
|   "IOPowerManagement" = {"PowerOverrideOn"=Yes,"CapabilityFlags"=0x8000,"MaxPowerState"=0x2,"DevicePowerState"=0x2,"ChildrenPowerState"=0x1,"DriverPowerState"=0x0,"CurrentPowerState"=0x2}
|   "USBSpeed" = 0x1
|   "idProduct" = 0x11a
|   "bcdDevice" = 0x100
|   "kUSBVendorString" = "HongHeTouch"
|   "locationID" = 0x14110000
|   "USB Product Name" = "HHTTOUCH"
|   "IOGeneralInterest" = "IOCommand is not serializable"
|   "kUSBCurrentConfiguration" = 0x1
|   "IOClassNameOverride" = "IOUSBDevice"
|   "bDeviceSubClass" = 0x0
|   "idVendor" = 0x4623
|   "AppleUSBAlternateServiceRegistryID" = 0x100008955
|   "bDeviceProtocol" = 0x0
|   "bDeviceClass" = 0x0
| }
| 
+-o AppleUSBHostLegacyClient  <class AppleUSBHostLegacyClient, id 0x100008956, !registered, !matched, active, busy 0, retain 8>
|   {…}
|   
+-o AppleUSBHostCompositeDevice  <class AppleUSBHostCompositeDevice, id 0x10000897f, !registered, !matched, active, busy 0, retain 4>
|   {…}
|   
+-o IOUSBHostInterface@0  <class IOUSBHostInterface, id 0x100008980, registered, matched, active, busy 0 (411 ms), retain 11>
| | {
| |   "USBPortType" = 0x0
| |   "IOCFPlugInTypes" = {"2d9786c6-9ef3-11d4-ad51-000a27052861"="IOUSBFamily.kext/Contents/PlugIns/IOUSBLib.bundle"}
| |   "bcdDevice" = 0x100
| |   "USBSpeed" = 0x1
| |   "idProduct" = 0x11a
| |   "bConfigurationValue" = 0x1
| |   "bInterfaceSubClass" = 0x0
| |   "locationID" = 0x14110000
| |   "IOGeneralInterest" = "IOCommand is not serializable"
| |   "IOClassNameOverride" = "IOUSBInterface"
| |   "AppleUSBAlternateServiceRegistryID" = 0x100008982
| |   "idVendor" = 0x4623
| |   "bInterfaceProtocol" = 0x0
| |   "bAlternateSetting" = 0x0
| |   "bInterfaceNumber" = 0x0
| |   "bInterfaceClass" = 0x3
| | }
| | 
| +-o IOUSBHostHIDDevice@14110000,0  <class IOUSBHostHIDDevice, id 0x100008989, registered, matched, active, busy 0 (13 ms), retain 10>
|   | {
|   |   "IOClass" = "IOUSBHostHIDDevice"
|   |   "Transport" = "USB"
|   |   "BootProtocol" = 0x0
|   |   "IOPersonalityPublisher" = "com.apple.driver.usb.IOUSBHostHIDDeviceSafeBoot"
|   |   "HIDDefaultBehavior" = ""
|   |   "MaxInputReportSize" = 0x40
|   |   "IOProviderClass" = "IOUSBHostInterface"
|   |   "Manufacturer" = "HongHeTouch"
|   |   "Product" = "HHTTOUCH"
|   |   "DeviceUsagePairs" = ({"DeviceUsagePage"=0xd,"DeviceUsage"=0x4},{"DeviceUsagePage"=0xd,"DeviceUsage"=0xe},{"DeviceUsagePage"=0x1,"DeviceUsage"=0x2},{"DeviceUsagePage"=0x1,"DeviceUsage"=0x1},{"DeviceUsagePage"=0x1,"DeviceUsage"=0x6},{"DeviceUsagePage"=0xff00,"DeviceUsage"=0x0})
|   |   "IOProbeScore" = 0xc350
|   |   "MaxOutputReportSize" = 0x10
|   |   "ReportDescriptor" = <05…00$
|   |   "IOUserClientClass" = "IOHIDLibUserClient"
|   |   "bInterfaceSubClass" = 0x0
|   |   "bInterfaceClass" = 0x3
|   |   "IOCFPlugInTypes" = {"7DDEECA8-A7B4-11DA-8A0E-0014519758EF"="IOHIDFamily.kext/Contents/PlugIns/IOHIDLib.plugin","FA12FA38-6F1A-11D4-BA0C-0005028F18D5"="IOHIDFamily.kext/Contents/PlugIns/IOHIDLib.plugin"}
|   |   "CountryCode" = 0x0
|   |   "VendorID" = 0x4623
|   |   "VersionNumber" = 0x100
|   |   "IOMatchCategory" = "IODefaultMatchCategory"
|   |   "CFBundleIdentifier" = "com.apple.driver.usb.IOUSBHostHIDDevice"
|   |   "PrimaryUsage" = 0x4
|   |   "LocationID" = 0x14110000
|   |   "ProductID" = 0x11a
|   |   "Elements" = ({"ReportID"=0x0,"ElementCookie"=0x1,"CollectionType"=0x1,"Type"=0x201,"Elements"=({"ReportID"=0x0,"ElementCookie"=0x2,"CollectionType"=0x2,"Type"=0x201,"Elements"=({"UnitExponent"=0x0,"IsRelative"=No,"UsagePage"=0xd,"Max"=0x1,"IsArray"=No,"Min"=0x0,"Type"=0x2,"Size"=0x1,"Flags"=0x2,"ReportID"=0x1,"Usage"=0x42,"ReportCount"=0x1,"Unit"=0x0,"HasNullState"=No,"IsNonLinear"=No,"HasPreferredState"=Yes,"ReportSize"=0x1,"ScaledMin"=0x0,"IsWrapping"=No,"ScaledMax"=0x1,"ElementCookie"=0x12},{"UnitExponent"=0$
|   |   "IOGeneralInterest" = "IOCommand is not serializable"
|   |   "PrimaryUsagePage" = 0xd
|   |   "ReportInterval" = 0x1f40
|   |   "MaxFeatureReportSize" = 0x3
|   |   "InputReportElements" = ({"ReportID"=0x1,"ElementCookie"=0x19b,"Size"=0x1f0,"ReportCount"=0x1,"Type"=0x1,"UsagePage"=0x0,"ReportSize"=0x1f0,"Usage"=0x0},{"ReportID"=0x2,"ElementCookie"=0x19c,"Size"=0x8,"ReportCount"=0x1,"Type"=0x1,"UsagePage"=0x0,"ReportSize"=0x8,"Usage"=0x0},{"ReportID"=0x3,"ElementCookie"=0x19d,"Size"=0x8,"ReportCount"=0x1,"Type"=0x1,"UsagePage"=0x0,"ReportSize"=0x8,"Usage"=0x0},{"ReportID"=0x4,"ElementCookie"=0x19e,"Size"=0x30,"ReportCount"=0x1,"Type"=0x1,"UsagePage"=0x0,"ReportSize"=0x30,"Us$
|   | }
|   | 
|   +-o IOHIDInterface  <class IOHIDInterface, id 0x10000898f, registered, matched, active, busy 0 (12 ms), retain 7>
|   | | {
|   | |   "VendorID" = 0x4623
|   | |   "CountryCode" = 0x0
|   | |   "Product" = "HHTTOUCH"
|   | |   "VersionNumber" = 0x100
|   | |   "PrimaryUsage" = 0x4
|   | |   "LocationID" = 0x14110000
|   | |   "BootProtocol" = 0x0
|   | |   "ProductID" = 0x11a
|   | |   "DeviceUsagePairs" = ({"DeviceUsagePage"=0xd,"DeviceUsage"=0x4},{"DeviceUsagePage"=0xd,"DeviceUsage"=0xe},{"DeviceUsagePage"=0x1,"DeviceUsage"=0x2},{"DeviceUsagePage"=0x1,"DeviceUsage"=0x1},{"DeviceUsagePage"=0x1,"DeviceUsage"=0x6},{"DeviceUsagePage"=0xff00,"DeviceUsage"=0x0})
|   | |   "Transport" = "USB"
|   | |   "ReportInterval" = 0x1f40
|   | |   "HIDDefaultBehavior" = ""
|   | |   "PrimaryUsagePage" = 0xd
|   | |   "Manufacturer" = "HongHeTouch"
|   | | }
|   | | 
|   | +-o IOHIDEventDriver  <class IOHIDEventDriver, id 0x100008992, registered, matched, active, busy 0 (1 ms), retain 10>
|   |   | {
|   |   |   "IOClass" = "IOHIDEventDriver"
|   |   |   "MultiAxisPointer" = {"Elements"=(),"AxisCapabilities"=0x0}
|   |   |   "Scroll" = {"Elements"=()}
|   |   |   "BootProtocol" = 0x0
|   |   |   "Digitizer" = {"Transducers"=({"Elements"=({"UnitExponent"=0x0,"IsRelative"=No,"UsagePage"=0xd,"Max"=0x1,"IsArray"=No,"Min"=0x0,"Type"=0x2,"Size"=0x1,"Flags"=0x2,"ReportID"=0x1,"Usage"=0x42,"ReportCount"=0x1,"Unit"=0x0,"HasNullState"=No,"IsNonLinear"=No,"HasPreferredState"=Yes,"ReportSize"=0x1,"ScaledMin"=0x0,"IsWrapping"=No,"ScaledMax"=0x1,"ElementCookie"=0x12},{"UnitExponent"=0x0,"IsRelative"=No,"UsagePage"=0xd,"Max"=0x1,"IsArray"=No,"Min"=0x0,"Type"=0x2,"Size"=0x1,"Flags"=0x2,"ReportID"=0x1,"Usage"=0x32,"$
|   |   |   "Keyboard" = {"Elements"=({"UnitExponent"=0x0,"IsRelative"=No,"UsagePage"=0x7,"Max"=0x1,"IsArray"=No,"Min"=0x0,"Type"=0x2,"Size"=0x1,"Flags"=0x2,"ReportID"=0x5,"Usage"=0xe0,"ReportCount"=0x1,"Unit"=0x0,"HasNullState"=No,"IsNonLinear"=No,"HasPreferredState"=Yes,"ReportSize"=0x1,"ScaledMin"=0x0,"IsWrapping"=No,"ScaledMax"=0x1,"ElementCookie"=0x33},{"UnitExponent"=0x0,"IsRelative"=No,"UsagePage"=0x7,"Max"=0x1,"IsArray"=No,"Min"=0x0,"Type"=0x2,"Size"=0x1,"Flags"=0x2,"ReportID"=0x5,"Usage"=0xe1,"ReportCount"=0x1,$
|   |   |   "IOPersonalityPublisher" = "com.apple.iokit.IOHIDEventDriver"
|   |   |   "Transport" = "USB"
|   |   |   "HIDDefaultBehavior" = ""
|   |   |   "Manufacturer" = "HongHeTouch"
|   |   |   "IOProviderClass" = "IOHIDInterface"
|   |   |   "GameControllerType" = 0x0
|   |   |   "Product" = "HHTTOUCH"
|   |   |   "DisplayIntegrated" = Yes
|   |   |   "DeviceUsagePairs" = ({"DeviceUsagePage"=0xd,"DeviceUsage"=0x4},{"DeviceUsagePage"=0xd,"DeviceUsage"=0xe},{"DeviceUsagePage"=0x1,"DeviceUsage"=0x2},{"DeviceUsagePage"=0x1,"DeviceUsage"=0x1},{"DeviceUsagePage"=0x1,"DeviceUsage"=0x6},{"DeviceUsagePage"=0xff00,"DeviceUsage"=0x0})
|   |   |   "IOProbeScore" = 0x4b0
|   |   |   "VendorIDSource" = 0x0
|   |   |   "HIDPointerResolution" = 0x1900000
|   |   |   "RelativePointer" = {"Elements"=()}
|   |   |   "VendorID" = 0x4623
|   |   |   "VersionNumber" = 0x100
|   |   |   "CountryCode" = 0x0
|   |   |   "IOMatchCategory" = "IODefaultMatchCategory"
|   |   |   "CFBundleIdentifier" = "com.apple.iokit.IOHIDFamily"
|   |   |   "LED" = {"Elements"=({"UnitExponent"=0x0,"IsRelative"=No,"UsagePage"=0x8,"Max"=0x1,"IsArray"=No,"Min"=0x0,"Type"=0x81,"Size"=0x1,"Flags"=0x2,"ReportID"=0x5,"Usage"=0x1,"ReportCount"=0x1,"Unit"=0x0,"HasNullState"=No,"IsNonLinear"=No,"HasPreferredState"=Yes,"ReportSize"=0x1,"ScaledMin"=0x0,"IsWrapping"=No,"ScaledMax"=0x1,"ElementCookie"=0x122},{"UnitExponent"=0x0,"IsRelative"=No,"UsagePage"=0x8,"Max"=0x1,"IsArray"=No,"Min"=0x0,"Type"=0x81,"Size"=0x1,"Flags"=0x2,"ReportID"=0x5,"Usage"=0x2,"ReportCount"=0x1,"Uni$
|   |   |   "HIDEventServiceProperties" = {"HIDSubinterfaceID"=0x28,"HIDKeyboardModifierMappingPairs"=()}
|   |   |   "LocationID" = 0x14110000
|   |   |   "ProductID" = 0x11a
|   |   |   "ReportInterval" = 0x1f40
|   |   |   "SupportsInk" = 0x1
|   |   |   "GameControllerPointer" = {"Elements"=({"UnitExponent"=0x0,"IsRelative"=No,"UsagePage"=0x8,"Max"=0x1,"IsArray"=No,"Min"=0x0,"Type"=0x81,"Size"=0x1,"Flags"=0x2,"ReportID"=0x5,"Usage"=0x1,"ReportCount"=0x1,"Unit"=0x0,"HasNullState"=No,"IsNonLinear"=No,"HasPreferredState"=Yes,"ReportSize"=0x1,"ScaledMin"=0x0,"IsWrapping"=No,"ScaledMax"=0x1,"ElementCookie"=0x122},{"UnitExponent"=0x0,"IsRelative"=No,"UsagePage"=0x8,"Max"=0x1,"IsArray"=No,"Min"=0x0,"Type"=0x81,"Size"=0x1,"Flags"=0x2,"ReportID"=0x5,"Usage"=0x2,"Rep$
|   |   | }
|   |   | 
|   |   +-o IOHIDPointing  <class IOHIDPointing, id 0x100008994, registered, matched, active, busy 0 (1 ms), retain 9>
|   |   | | {
|   |   | |   "HIDScrollAccelerationType" = "HIDMouseScrollAcceleration"
|   |   | |   "HIDVirtualDevice" = No
|   |   | |   "Transport" = "USB"
|   |   | |   "HIDDeviceEventID" = 0x8994
|   |   | |   "Product" = "HHTTOUCH"
|   |   | |   "Manufacturer" = "HongHeTouch"
|   |   | |   "HIDPointerButtonCount" = 0xd
|   |   | |   "DeviceUsagePairs" = ({"DeviceUsagePage"=0xd,"DeviceUsage"=0x4},{"DeviceUsagePage"=0xd,"DeviceUsage"=0xe},{"DeviceUsagePage"=0x1,"DeviceUsage"=0x2},{"DeviceUsagePage"=0x1,"DeviceUsage"=0x1},{"DeviceUsagePage"=0x1,"DeviceUsage"=0x6},{"DeviceUsagePage"=0xff00,"DeviceUsage"=0x0})
|   |   | |   "HIDPointerResolution" = 0x1900000
|   |   | |   "VendorIDSource" = 0x0
|   |   | |   "alt_sender_id" = 0x100008992
|   |   | |   "HIDPointerConvertAbsolute" = <00>
|   |   | |   "CountryCode" = 0x0
|   |   | |   "VendorID" = 0x4623
|   |   | |   "VersionNumber" = 0x100
|   |   | |   "HIDSubinterfaceID" = 0x0
|   |   | |   "HIDResetPointer" = Yes
|   |   | |   "HIDInterfaceID" = 0x0
|   |   | |   "HIDPointerContactToMove" = <00>
|   |   | |   "LocationID" = 0x14110000
|   |   | |   "ProductID" = 0x11a
|   |   | |   "HIDKind" = 0x2
|   |   | |   "HIDPointerAccelerationType" = "HIDMouseAcceleration"
|   |   | |   "ReportInterval" = 0x1f40
|   |   | |   "HIDScrollAccelCurvesDebug" = ("no scroll resolution for type","no scroll resolution for type","no scroll resolution for type")
|   |   | | }
|   |   | | 
|   |   | +-o IOHIDSystem  <class IOHIDSystem, id 0x100000313, registered, matched, active, busy 0 (0 ms), retain 20>
|   |   |   | {…}
|   |   |   | 
|   |   |   +-o IOHIDUserClient  <class IOHIDUserClient, id 0x100000446, !registered, !matched, active, busy 0, retain 5>
|   |   |   |   {…}
|   |   |   |   
|   |   |   +-o IOHIDParamUserClient  <class IOHIDParamUserClient, id 0x10000044b, !registered, !matched, active, busy 0, retain 5>
|   |   |       {…}
|   |   |       
|   |   +-o IOHIDKeyboard  <class IOHIDKeyboard, id 0x100008995, registered, matched, active, busy 0 (0 ms), retain 9>
|   |   | | {…}
|   |   | | 
|   |   | +-o IOHIDSystem  <class IOHIDSystem, id 0x100000313, registered, matched, active, busy 0 (0 ms), retain 20>
|   |   |   | {…}
|   |   |   | 
|   |   |   +-o IOHIDUserClient  <class IOHIDUserClient, id 0x100000446, !registered, !matched, active, busy 0, retain 5>
|   |   |   |   {…}
|   |   |   |   
|   |   |   +-o IOHIDParamUserClient  <class IOHIDParamUserClient, id 0x10000044b, !registered, !matched, active, busy 0, retain 5>
|   |   |       {…}
|   |   |       
|   |   +-o IOHIDSystem  <class IOHIDSystem, id 0x100000313, registered, matched, active, busy 0 (0 ms), retain 19>
|   |     | {…}
|   |     | 
|   |     +-o IOHIDUserClient  <class IOHIDUserClient, id 0x100000446, !registered, !matched, active, busy 0, retain 5>
|   |     |   {…}
|   |     |   
|   |     +-o IOHIDParamUserClient  <class IOHIDParamUserClient, id 0x10000044b, !registered, !matched, active, busy 0, retain 5>
|   |         {…}
|   |         
|   +-o IOHIDLibUserClient  <class IOHIDLibUserClient, id 0x100008990, !registered, !matched, active, busy 0, retain 6>
|   |   {…}
|   |   
|   +-o IOHIDLibUserClient  <class IOHIDLibUserClient, id 0x100008991, !registered, !matched, active, busy 0, retain 6>
|       {…}
|       
+-o IOUSBHostInterface@1  <class IOUSBHostInterface, id 0x100008981, registered, matched, active, busy 0 (280 ms), retain 11>
  | {
  |   "USBPortType" = 0x0
  |   "IOCFPlugInTypes" = {"2d9786c6-9ef3-11d4-ad51-000a27052861"="IOUSBFamily.kext/Contents/PlugIns/IOUSBLib.bundle"}
  |   "bcdDevice" = 0x100
  |   "USBSpeed" = 0x1
  |   "idProduct" = 0x11a
  |   "bConfigurationValue" = 0x1
  |   "bInterfaceSubClass" = 0x0
  |   "locationID" = 0x14110000
  |   "IOGeneralInterest" = "IOCommand is not serializable"
  |   "IOClassNameOverride" = "IOUSBInterface"
  |   "AppleUSBAlternateServiceRegistryID" = 0x100008984
  |   "idVendor" = 0x4623
  |   "bInterfaceProtocol" = 0x0
  |   "bAlternateSetting" = 0x0
  |   "bInterfaceNumber" = 0x1
  |   "bInterfaceClass" = 0x3
  | }
  | 
  +-o IOUSBHostHIDDevice@14110000,1  <class IOUSBHostHIDDevice, id 0x100008988, registered, matched, active, busy 0 (4 ms), retain 10>
    | {
    |   "IOClass" = "IOUSBHostHIDDevice"
    |   "Transport" = "USB"
    |   "BootProtocol" = 0x0
    |   "IOPersonalityPublisher" = "com.apple.driver.usb.IOUSBHostHIDDeviceSafeBoot"
    |   "HIDDefaultBehavior" = ""
    |   "MaxInputReportSize" = 0x40
    |   "IOProviderClass" = "IOUSBHostInterface"
    |   "Manufacturer" = "HongHeTouch"
    |   "Product" = "HHTTOUCH"
    |   "DeviceUsagePairs" = ({"DeviceUsagePage"=0xff00,"DeviceUsage"=0x1})
    |   "IOProbeScore" = 0xc350
    |   "MaxOutputReportSize" = 0x40
    |   "ReportDescriptor" = <06…c0>
    |   "IOUserClientClass" = "IOHIDLibUserClient"
    |   "bInterfaceSubClass" = 0x0
    |   "bInterfaceClass" = 0x3
    |   "IOCFPlugInTypes" = {"7DDEECA8-A7B4-11DA-8A0E-0014519758EF"="IOHIDFamily.kext/Contents/PlugIns/IOHIDLib.plugin","FA12FA38-6F1A-11D4-BA0C-0005028F18D5"="IOHIDFamily.kext/Contents/PlugIns/IOHIDLib.plugin"}
    |   "CountryCode" = 0x21
    |   "VendorID" = 0x4623
    |   "VersionNumber" = 0x100
    |   "IOMatchCategory" = "IODefaultMatchCategory"
    |   "CFBundleIdentifier" = "com.apple.driver.usb.IOUSBHostHIDDevice"
    |   "PrimaryUsage" = 0x1
    |   "LocationID" = 0x14110000
    |   "ProductID" = 0x11a
    |   "Elements" = ({"ReportID"=0x0,"ElementCookie"=0x1,"CollectionType"=0x1,"Type"=0x201,"Elements"=({"UnitExponent"=0x0,"IsRelative"=No,"UsagePage"=0xff00,"Max"=0xff,"IsArray"=No,"Min"=0x0,"Type"=0x1,"Size"=0x8,"Flags"=0x2,"ReportID"=0x1,"Usage"=0x1,"ReportCount"=0x1,"Unit"=0x0,"HasNullState"=No,"IsNonLinear"=No,"HasPreferredState"=Yes,"ReportSize"=0x8,"ScaledMin"=0x0,"IsWrapping"=No,"ScaledMax"=0xff,"ElementCookie"=0x2},{"UnitExponent"=0x0,"IsRelative"=No,"UsagePage"=0xff00,"Max"=0xff,"IsArray"=No,"Min"=0x0,"Type"=$
    |   "IOGeneralInterest" = "IOCommand is not serializable"
    |   "PrimaryUsagePage" = 0xff00
    |   "ReportInterval" = 0x1f40
    |   "MaxFeatureReportSize" = 0x1
    |   "InputReportElements" = ({"ReportID"=0x1,"ElementCookie"=0x2c4,"Size"=0x200,"ReportCount"=0x1,"Type"=0x1,"UsagePage"=0x0,"ReportSize"=0x200,"Usage"=0x0},{"ReportID"=0x2,"ElementCookie"=0x2c5,"Size"=0x200,"ReportCount"=0x1,"Type"=0x1,"UsagePage"=0x0,"ReportSize"=0x200,"Usage"=0x0},{"ReportID"=0x3,"ElementCookie"=0x2c6,"Size"=0x200,"ReportCount"=0x1,"Type"=0x1,"UsagePage"=0x0,"ReportSize"=0x200,"Usage"=0x0},{"ReportID"=0x4,"ElementCookie"=0x2c7,"Size"=0x200,"ReportCount"=0x1,"Type"=0x1,"UsagePage"=0x0,"ReportSize"$
    | }
    | 
    +-o IOHIDInterface  <class IOHIDInterface, id 0x10000898b, registered, matched, active, busy 0 (4 ms), retain 6>
    |   {
    |     "VendorID" = 0x4623
    |     "CountryCode" = 0x21
    |     "Product" = "HHTTOUCH"
    |     "VersionNumber" = 0x100
    |     "PrimaryUsage" = 0x1
    |     "LocationID" = 0x14110000
    |     "BootProtocol" = 0x0
    |     "ProductID" = 0x11a
    |     "DeviceUsagePairs" = ({"DeviceUsagePage"=0xff00,"DeviceUsage"=0x1})
    |     "Transport" = "USB"
    |     "ReportInterval" = 0x1f40
    |     "HIDDefaultBehavior" = ""
    |     "PrimaryUsagePage" = 0xff00
    |     "Manufacturer" = "HongHeTouch"
    |   }
    |   
    +-o IOHIDLibUserClient  <class IOHIDLibUserClient, id 0x10000898c, !registered, !matched, active, busy 0, retain 6>
    |   {
    |     "IOUserClientCreator" = "pid 94, loginwindow"
    |   }
    |   
    +-o IOHIDLibUserClient  <class IOHIDLibUserClient, id 0x10000898d, !registered, !matched, active, busy 0, retain 6>
        {
          "IOUserClientCreator" = "pid 274, UserEventAgent"
        }

The device serves as a combination of both a keyboard (with PgUp and PgDn accessible via remote control) and a multi-touch input device. The keyboard aspect works well enough: OS X reports the keyboard as unknown type, asking to press a specific shift key. Since I don't have shift, I press either of those page movement buttons and then can manually select a keyboard type. After that, I can use the keys to scroll in applications.

The touch input, however, seems to be non-functional. The device is reported as IOHIDPointing and Digitizer in the above report, so there appears to be some understanding about what kind of device that is. Nevertheless I don't see it controlling my mouse pointer.

  • Do I have to enable this device somehow, to say that the multi-touch events from that source should control my mouse pointer?
  • Do I have to load any additional drivers, to make HID multi-touch events end up controlling my pointer?
  • Is there some tool (command line or graphical, shipped with OS X or third party) which I can use to debug which events the device generates? Preferably at different levels, like HID, touch, pointer or whatever the actual architecture is?

Edit: I opened Apple bug report 25216130 about this.

  • I got some feedback from Apple: they asked for sudo sysdiagnose output, and then for sudo dtrace -n 'fbt::*HIDPointing*:entry' output. The latter is (almost) empty, so I gave them the output from some wider HID-related dtrace patterns, like fbt:com.apple.iokit.IOHIDFamily::entry. No reply since, last post Mar 31. I wait and hope. – MvG Apr 12 '16 at 6:06
1

There is a bug in the Apple USB stack, which prevents some USB Composite Devices to work. I opened a Apple TSI and a bug report about this, and I was given a workaround, that fixes it for me. The workaround is simply a codeless kext, with this personality added to the dictionary of IOKitPersonalities:

    <key>Display Workaround</key>
    <dict>
        <key>CFBundleIdentifier</key>
        <string>com.apple.driver.AppleUSBHostMergeProperties</string>
        <key>IOClass</key>
        <string>AppleUSBHostMergeProperties</string>
        <key>IOProviderClass</key>
        <string>IOUSBHostDevice</string>
        <key>IOProviderMergeProperties</key>
        <dict>
            <key>kUSBRemoteWakeOverride</key>
            <false/>
        </dict>
        <key>idVendor</key>
        <integer>17955</integer>
        <key>idProduct</key>
        <integer>282</integer>
    </dict>

(I added your VID/PID above).

A future OS X version will (hopefully) fix this.

Please note that the codeless kext must be placed on /Library/Extensions, and that must be signed.

  • That “kext must be signed” is a big hurdle here, since I'm unwilling to pay for ADP Enrollment just for this, and since apple.stackexchange.com/q/174146/25135 and stackoverflow.com/q/26723321/1468366 sound like self-signed certs would not be an option for kexts. I did sudo nvram boot-args='kext-dev-mode=1' and rebooted, but apparently the kext still doesn't get loaded. See gist.github.com/gagern/6d98868c75f009d641aa for my plist and my attempts to diagnose. Any ideas? – MvG Mar 17 '16 at 12:47
  • Found a post which states that kext-dev-mode works for 10.10 Yosemite only, not 10.11 El Capitan. Will have to try to find some ADP member who either has a kext signing certificate or is willing to obtain one. Quite a lot of work to work around a bug! – MvG Mar 17 '16 at 12:57
  • Following apple.stackexchange.com/a/209653/25135 and developer.apple.com/library/ios/documentation/Security/… I tried csrutil disable. Now kextutil claims to load the thing, but kextstat doesn't list it, and the device still doesn't work. Makes me wonder whether it's a kext loading issue or whether the workaround doesn't apply to my case. – MvG Mar 17 '16 at 13:22
  • this is a somewhat special kext, for some reasons: 1) it's not loaded by you, but loaded automatically by OSX based on match'es on HW IDs, 2) it's only setting some property on the Apple Composite Driver. To verify it's loaded, you have to issue the "ioreg -lw0" command and then traverse the tree, searching for your device. It should have the "kUSBRemoteWakeOverride" option set somewhere. – gog Mar 21 '16 at 10:00
  • also, try adding the <key>OSBundleRequired</key> <string>Local-Root</string> key to the main plist dict. It may be that's needed in order to force it to be loaded. – gog Mar 21 '16 at 10:06

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .