ddcctl
ddcctl copied to clipboard
Duplicate displays cannot be addressed
System
- MacBook Pro (Retina, 15-inch, Mid 2015)
- 2,2 GHz Intel Core i7
- Intel Iris Pro 1536 MB
Monitors
- Internal Retina Display
- 2 x Samsung S27C750
Connections
- 1 x HDMI
- 1 x DP
Issue When either of the displays is connected, addressing them works fine and brightness, contrast and standby controls work. However, when both of the displays are connected, one displays responds to the commands for both display 2 and 3.
Command Single external monitor connected
redacted@redacted ~ ddcctl -d 2 -b 100
2016-12-09 19:18:24.615 ddcctl[25191:3378607] D: NSScreen #69733248 (1440x900) DPI is 110.50
2016-12-09 19:18:24.615 ddcctl[25191:3378607] D: NSScreen #188930901 (1080x1920) DPI is 82.00
2016-12-09 19:18:24.615 ddcctl[25191:3378607] I: found 2 displays
2016-12-09 19:18:24.615 ddcctl[25191:3378607] I: polling display 2's EDID
VN:19501 PN:2656 SN:1515733847 UN:1 IN:15619 AppleIntelFramebuffer IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/IGPU@2/AppleIntelFramebuffer@1/display0/AppleDisplay-Portrait
2016-12-09 19:18:24.649 ddcctl[25191:3378607] D: command arg-pair: d: 2
2016-12-09 19:18:24.649 ddcctl[25191:3378607] D: command arg-pair: b: 100
2016-12-09 19:18:24.649 ddcctl[25191:3378607] D: setting VCP control #16 => 100
VN:19501 PN:2656 SN:1515733847 UN:1 IN:16651 AppleIntelFramebuffer IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/IGPU@2/AppleIntelFramebuffer@1/display0/AppleDisplay-Portrait
Two external monitors connected Monitor 1
redacted@redacted ~ ddcctl -d 2 -b 100
2016-12-09 19:20:26.103 ddcctl[25276:3380721] D: NSScreen #69733248 (1280x800) DPI is 98.00
2016-12-09 19:20:26.103 ddcctl[25276:3380721] D: NSScreen #188930901 (1080x1920) DPI is 82.00
2016-12-09 19:20:26.103 ddcctl[25276:3380721] D: NSScreen #188930903 (1920x1080) DPI is 82.00
2016-12-09 19:20:26.103 ddcctl[25276:3380721] I: found 3 displays
2016-12-09 19:20:26.104 ddcctl[25276:3380721] I: polling display 2's EDID
VN:19501 PN:2656 SN:1515733847 UN:1 IN:15619 AppleIntelFramebuffer IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/IGPU@2/AppleIntelFramebuffer@1/display0/AppleDisplay-Portrait
2016-12-09 19:20:26.133 ddcctl[25276:3380721] D: command arg-pair: d: 2
2016-12-09 19:20:26.133 ddcctl[25276:3380721] D: command arg-pair: b: 100
2016-12-09 19:20:26.133 ddcctl[25276:3380721] D: setting VCP control #16 => 100
VN:19501 PN:2656 SN:1515733847 UN:1 IN:16651 AppleIntelFramebuffer IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/IGPU@2/AppleIntelFramebuffer@1/display0/AppleDisplay-Portrait
Monitor 2
redacted@redacted ~ ddcctl -d *3* -b 100
2016-12-09 19:19:26.787 ddcctl[25254:3379875] D: NSScreen #69733248 (1280x800) DPI is 98.00
2016-12-09 19:19:26.787 ddcctl[25254:3379875] D: NSScreen #188930901 (1080x1920) DPI is 82.00
2016-12-09 19:19:26.788 ddcctl[25254:3379875] D: NSScreen #188930903 (1920x1080) DPI is 82.00
2016-12-09 19:19:26.788 ddcctl[25254:3379875] I: found 3 displays
2016-12-09 19:19:26.788 ddcctl[25254:3379875] I: polling display 3's EDID
VN:19501 PN:2656 SN:1515733847 UN:3 IN:15619 AppleIntelFramebuffer IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/IGPU@2/AppleIntelFramebuffer@1/display0/AppleDisplay-Portrait
2016-12-09 19:19:26.815 ddcctl[25254:3379875] D: command arg-pair: d: 3
2016-12-09 19:19:26.815 ddcctl[25254:3379875] D: command arg-pair: b: 100
2016-12-09 19:19:26.815 ddcctl[25254:3379875] D: setting VCP control #16 => 100
VN:19501 PN:2656 SN:1515733847 UN:3 IN:16651 AppleIntelFramebuffer IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/IGPU@2/AppleIntelFramebuffer@1/display0/AppleDisplay-Portrait
Output of make displaylist framebuffers
ioreg -c IODisplayConnect -b -f -r -l -i -d 2
+-o display0 <class IORegistryEntry:IOService:IODisplayConnect, id 0x100005ba1, registered, matched, active, busy 0 (0 ms), retain 6>
| {
| }
|
+-o AppleBacklightDisplay <class IORegistryEntry:IOService:IODisplay:IOBacklightDisplay:AppleBacklightDisplay, id 0x100005ba2, registered, matched, active, busy 0 (0 ms), retain 9>
{
"IOClass" = "AppleBacklightDisplay"
"CFBundleIdentifier" = "com.apple.iokit.IOGraphicsFamily"
"IOProviderClass" = "IODisplayConnect"
"DisplayProductID" = 41006
"IODisplayEDID" =
00000000: 00 FF FF FF FF FF FF 00 06 10 2E A0 00 00 00 00 04 19 01 04 A5 21 15 78 02 6F B1 A7 55 4C 9E 25 .....................!.x.o..UL.%
00000020: 0C 50 54 00 00 00 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 EF 83 40 A0 B0 08 34 70 30 20 [email protected]
00000040: 36 00 4B CF 10 00 00 1A 00 00 00 FC 00 43 6F 6C 6F 72 20 4C 43 44 0A 20 20 20 00 00 00 10 00 00 6.K..........Color LCD. ......
00000060: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 D0 ................................
"IODisplayPrefsKey" = "IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/IGPU@2/AppleIntelFramebuffer@0/display0/AppleBacklightDisplay-610-a02e"
"IODisplayGUID" = 436849163854938112
"IOProbeScore" = 3000
"IODisplayParameters" = {"commit"={"reg"=0},"fade-time2"={"min"=0,"max"=10000,"value"=4000},"ggsc"={"min"=0,"max"=65536,"value"=65536},"gsc "={"min"=0,"max"=65536,"value"=65536},"vblm"={"min"=0,"max"=196608,"value"$
"IOPowerManagement" = {"CapabilityFlags"=49152,"MaxPowerState"=3,"CurrentPowerState"=3}
"IOMatchCategory" = "IODefaultMatchCategory"
"IODisplayAttributes" = {"IODisplayAttributes"=<676174760000000073676c6604000000726c6f630100000063706220020000006364670080808000676c666400000000>}
"IODisplayConnectFlags" = <00080000>
"DisplayVendorID" = 1552
"DisplayParameterHandlerUsesCharPtr" = Yes
"DisplaySerialNumber" = 0
}
+-o display0 <class IORegistryEntry:IOService:IODisplayConnect, id 0x100005ba5, registered, matched, active, busy 0 (0 ms), retain 6>
| {
| }
|
+-o AppleDisplay-Portrait <class IORegistryEntry:IOService:IODisplay:AppleDisplay, id 0x100005ba7, registered, matched, active, busy 0 (0 ms), retain 10>
{
"IOClass" = "AppleDisplay"
"CFBundleIdentifier" = "com.apple.iokit.IOGraphicsFamily"
"IOProviderClass" = "IODisplayConnect"
"DisplayProductID" = 2656
"IODisplayEDID" =
00000000: 00 FF FF FF FF FF FF 00 4C 2D 60 0A 57 43 58 5A 22 17 01 03 80 3C 22 78 2A F7 11 A3 56 4F 9E 28 ........L-`.WCXZ"....<"x*...VO.(
00000020: 0F 50 54 BF EF 80 71 4F 81 C0 81 00 81 80 95 00 A9 C0 B3 00 01 01 02 3A 80 18 71 38 2D 40 58 2C .PT...qO...............:..q8-@X,
00000040: 45 00 56 50 21 00 00 1E 01 1D 00 72 51 D0 1E 20 6E 28 55 00 56 50 21 00 00 1E 00 00 00 FD 00 32 E.VP!......rQ.. n(U.VP!........2
00000060: 4B 1E 51 11 00 0A 20 20 20 20 20 20 00 00 00 FC 00 53 32 37 43 37 35 30 0A 20 20 20 20 20 01 90 K.Q... .....S27C750. ..
00000080: 02 03 1A F1 46 90 04 1F 13 03 12 23 09 07 07 83 01 00 00 66 03 0C 00 10 00 80 01 1D 00 BC 52 D0 ....F......#.......f..........R.
000000A0: 1E 20 B8 28 55 40 56 50 21 00 00 1E 8C 0A D0 90 20 40 31 20 0C 40 55 00 56 50 21 00 00 18 8C 0A . .(U@VP!....... @1 [email protected]!.....
000000C0: D0 8A 20 E0 2D 10 10 3E 96 00 56 50 21 00 00 18 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 .. .-..>..VP!...................
000000E0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 61 ...............................a
"IODisplayPrefsKey" = "IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/IGPU@2/AppleIntelFramebuffer@1/display0/AppleDisplay-4c2d-a60"
"IOPowerManagement" = {"CapabilityFlags"=49152,"MaxPowerState"=3,"CurrentPowerState"=3}
"IOProbeScore" = 2000
"IODisplayParameters" = {"bgsc"={"min"=0,"max"=65536,"value"=65536},"pscn"={"min"=8800,"max"=10000,"value"=10000},"rgsc"={"min"=0,"max"=65536,"value"=65536},"cmod"={"min"=0,"max"=4096,"value"=256},"ggsc"={"min"=0,"$
"IOMatchCategory" = "IODefaultMatchCategory"
"IODisplayAttributes" = {"IODisplayAttributes"=<676174760000000073676c6600000000726c6f631101000063706220020202006364670080808000676c666401000000>,"IODisplayVSDB030C00"=<100080>}
"IODisplayConnectFlags" = <00000000>
"DisplayVendorID" = 19501
"DisplaySerialNumber" = 1515733847
}
+-o display0 <class IORegistryEntry:IOService:IODisplayConnect, id 0x100005ba9, registered, matched, active, busy 0 (0 ms), retain 6>
| {
| }
|
+-o AppleDisplay <class IORegistryEntry:IOService:IODisplay:AppleDisplay, id 0x100005bab, registered, matched, active, busy 0 (0 ms), retain 8>
{
"IOClass" = "AppleDisplay"
"CFBundleIdentifier" = "com.apple.iokit.IOGraphicsFamily"
"IOProviderClass" = "IODisplayConnect"
"DisplayProductID" = 2656
"IODisplayEDID" =
00000000: 00 FF FF FF FF FF FF 00 4C 2D 60 0A 57 43 58 5A 22 17 01 03 80 3C 22 78 2A F7 11 A3 56 4F 9E 28 ........L-`.WCXZ"....<"x*...VO.(
00000020: 0F 50 54 BF EF 80 71 4F 81 C0 81 00 81 80 95 00 A9 C0 B3 00 01 01 02 3A 80 18 71 38 2D 40 58 2C .PT...qO...............:..q8-@X,
00000040: 45 00 56 50 21 00 00 1E 01 1D 00 72 51 D0 1E 20 6E 28 55 00 56 50 21 00 00 1E 00 00 00 FD 00 32 E.VP!......rQ.. n(U.VP!........2
00000060: 4B 1E 51 11 00 0A 20 20 20 20 20 20 00 00 00 FC 00 53 32 37 43 37 35 30 0A 20 20 20 20 20 01 90 K.Q... .....S27C750. ..
00000080: 02 03 1A F1 46 90 04 1F 13 03 12 23 09 07 07 83 01 00 00 66 03 0C 00 20 00 80 01 1D 00 BC 52 D0 ....F......#.......f... ......R.
000000A0: 1E 20 B8 28 55 40 56 50 21 00 00 1E 8C 0A D0 90 20 40 31 20 0C 40 55 00 56 50 21 00 00 18 8C 0A . .(U@VP!....... @1 [email protected]!.....
000000C0: D0 8A 20 E0 2D 10 10 3E 96 00 56 50 21 00 00 18 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 .. .-..>..VP!...................
000000E0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 51 ...............................Q
"IODisplayPrefsKey" = "IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/IGPU@2/AppleIntelFramebuffer@3/display0/AppleDisplay-4c2d-a60"
"IOPowerManagement" = {"CapabilityFlags"=49152,"MaxPowerState"=3,"CurrentPowerState"=3}
"IOProbeScore" = 2000
"IODisplayParameters" = {"bgsc"={"min"=0,"max"=65536,"value"=65536},"pscn"={"min"=8800,"max"=10000,"value"=10000},"rgsc"={"min"=0,"max"=65536,"value"=65536},"cmod"={"min"=0,"max"=4096,"value"=256},"ggsc"={"min"=0,"$
"IOMatchCategory" = "IODefaultMatchCategory"
"IODisplayAttributes" = {"IODisplayAttributes"=<676174760000000073676c6600000000726c6f631101000063706220020202006364670080808000676c666401000000>,"IODisplayVSDB030C00"=<200080>}
"IODisplayConnectFlags" = <00000000>
"DisplayVendorID" = 19501
"DisplaySerialNumber" = 1515733847
}
ioreg -c IOFramebuffer -k IOFBI2CInterfaceIDs -b -f -l -r -d 1
+-o AppleIntelFramebuffer@0 <class AppleIntelFramebuffer, id 0x1000003a3, registered, matched, active, busy 0 (121 ms), retain 18>
{
"IOI2CTransactionTypes" = 19
"IOFBScalerInfo" =
00000000: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0E 00 00 00 FF 1F 00 00 FF 1F 00 00 00 00 00 00 ................................
00000020: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
"IOPMStrictTreeOrder" = Yes
"AppleIntelMEVABundleName" = "AppleIntelIVBFBVA"
"av-signal-type" = <00000000>
"IOFBDependentIndex" = 0
"IOFBUIScale" = <02000000>
"audio-codec-info" = <00000000>
"IOFBMemorySize" = 268435456
"boot-gamma-restored" = <00000000>
"IOScreenRestoreState" = <00000000>
"IOFBGammaCount" = 1024
"IOFBCurrentPixelCount" = 5630080
"IOFBCLUTDefer" = Yes
"IOFramebufferOpenGLIndex" = 0
"AAPL,DisplayPipe" = <00000000>
"IOFBI2CInterfaceInfo" = ({"IOI2CInterfaceID"=0,"IOI2CTransactionTypes"=19})
"connector-type" = <02000000>
"IODisplayParameters" = "IOFramebufferParameterHandler is not serializable"
"startup-timing" =
00000000: 00 00 00 00 00 00 00 80 02 30 00 80 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 .........0......................
00000020: 00 0F 00 00 60 09 00 00 00 00 00 00 01 00 00 00 F0 A7 21 14 00 00 00 00 F0 A7 21 14 00 00 00 00 ....`.............!.......!.....
00000040: F0 A7 21 14 00 00 00 00 40 0B 00 00 A0 00 00 00 30 00 00 00 20 00 00 00 08 07 00 00 34 00 00 00 [email protected]... .......4...
00000060: 03 00 00 00 06 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 ................................
00000080: 00 00 00 00 00 00 00 00 02 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
000000A0: 00 00 00 00 00 00 00 00 ........
"AAPL,boot-display" = Yes
"IOAccelTypes" = "IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/IGPU@2/IntelAccelerator"
"built-in" = <>
"IOPowerManagement" = {"ChildrenPowerState"=2,"MaxPowerState"=2,"CurrentPowerState"=2,"CapabilityFlags"=32768,"ChildProxyPowerState"=2,"DriverPowerState"=1}
"IOFBCurrentPixelClock" = 337750000
"IOFBGammaWidth" = 10
"IOFBDependentID" = 4294968223
"IOAccelIndex" = 0
"IOFBWaitCursorFrames" = 29
"IOFBConfig" = {"IOFBModes"=({"ID"=18446744071562088448,"DM"=<400b00000807000082fd3b0000000000070000024b01cf00000000000000000000000000>,"TM"=<00500080000000000000000000000000000000000000000000000000000000000000000001$
"IOFBIntegrated" = Yes
"IOFBProbeOptions" = 1025
"IOFBNeedsRefresh" = No
"IOFBWaitCursorPeriod" = 33333333
"IOFBTransform" = 0
"IOFBCursorInfo" = (<0100000000010000000100002000000000000000000000000000000000000000000000000400000000000000ffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000$
"IOFBI2CInterfaceIDs" = (0)
"audio-device-nvalue" = <"Z">
"IOAccelRevision" = 2
"IOCFPlugInTypes" = {"ACCF0000-0000-0000-0000-000a2789904e"="IOAccelerator2D.plugin"}
"audio-device-mvalue" = <04000000>
"IOVARendererID" = 17305602
"IOFBTimingRange" =
00000000: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
00000020: 00 2D 31 01 00 00 00 00 00 0F BE 14 00 00 00 00 00 00 00 00 0F 00 00 00 0F 00 00 00 08 00 00 00 .-1.............................
00000040: 00 00 00 00 FF FF FF FF 00 00 00 00 FF FF FF FF FF 1F 00 00 FF 1F 00 00 00 00 00 00 00 00 00 00 ................................
00000060: 01 01 01 01 01 01 01 01 01 01 01 01 01 01 00 00 00 00 00 00 00 20 00 00 00 00 00 00 FF 1F 00 00 ..................... ..........
00000080: 00 00 00 00 FF 1F 00 00 00 00 00 00 FF 1F 00 00 00 00 00 00 00 0C 00 00 00 00 00 00 FF 1F 00 00 ................................
000000A0: 00 00 00 00 FF 1F 00 00 00 00 00 00 FF 1F 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
000000C0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
000000E0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
"IOFBDetailedTimings" = (<00500080000000000000000000000000000000000000000000000000000000000000000001000000f0a7211400000000f0a7211400000000f0a7211400000000400b0000a00000003000000020000000080700003400000003000000060000$
"IOFBCurrentPixelCountReal" = 5630080
"IOGeneralInterest" = "IOCommand is not serializable"
"port-number" = 0
"EnableLPVP" = 1
}
+-o AppleIntelFramebuffer@1 <class AppleIntelFramebuffer, id 0x1000003a4, registered, matched, active, busy 0 (504 ms), retain 17>
{
"IOI2CTransactionTypes" = 19
"IOFBScalerInfo" =
00000000: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 3E 00 00 00 FF 1F 00 00 FF 1F 00 00 00 00 00 00 ................>...............
00000020: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
"IOPMStrictTreeOrder" = Yes
"AppleIntelMEVABundleName" = "AppleIntelIVBFBVA"
"av-signal-type" = <08000000>
"IOFBDependentIndex" = 1
"IOFBUIScale" = <01000000>
"IOScreenRestoreState" = <00000000>
"audio-codec-info" = <00010500>
"CEAPixelRepetition" = <00>
"IOFBGammaCount" = 1024
"IOFBCurrentPixelCount" = 2475000
"IOFBCLUTDefer" = Yes
"IOFramebufferOpenGLIndex" = 1
"AAPL,DisplayPipe" = <02000000>
"IOFBI2CInterfaceInfo" = ({"IOI2CInterfaceID"=0,"IOI2CTransactionTypes"=19})
"connector-type" = <00040000>
"IODisplayParameters" = "IOFramebufferParameterHandler is not serializable"
"startup-timing" =
00000000: 00 00 00 00 00 00 00 80 00 10 00 80 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 30 00 00 00 ............................0...
00000020: 38 04 00 00 80 07 00 00 00 00 00 00 00 00 00 00 20 EE D9 08 00 00 00 00 20 EE D9 08 00 00 00 00 8............... ....... .......
00000040: 20 EE D9 08 00 00 00 00 80 07 00 00 18 01 00 00 58 00 00 00 2C 00 00 00 38 04 00 00 2D 00 00 00 ...............X...,...8...-...
00000060: 04 00 00 00 05 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 ................................
00000080: 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
000000A0: 00 00 00 00 00 00 00 00 ........
"IOAccelTypes" = "IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/IGPU@2/IntelAccelerator"
"IOPowerManagement" = {"ChildrenPowerState"=2,"MaxPowerState"=2,"CurrentPowerState"=2,"CapabilityFlags"=32768,"ChildProxyPowerState"=2,"DriverPowerState"=1}
"IOFBCurrentPixelClock" = 148500000
"IOFBGammaWidth" = 10
"IOFBDependentID" = 4294968223
"IOAccelIndex" = 1
"IOFBWaitCursorFrames" = 29
"audio-selector" = <"dp66">
"IOFBConfig" = {"IOFBModes"=({"ID"=18446744071562088448,"DM"=<380400008007000000003c00000000000700500250015602000000000000000000000000>,"TM"=<00500080000000000000000000000000000000003000000038040000800700000000000000$
"CEAModeID" = <10000000>
"IOFBIntegrated" = Yes
"IOFBProbeOptions" = 1025
"IOFBNeedsRefresh" = Yes
"IOFBWaitCursorPeriod" = 33333333
"IOFBTransform" = 48
"IOFBCursorInfo" = (<0100000000010000000100002000000000000000000000000000000000000000000000000400000000000000ffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000$
"IOFBI2CInterfaceIDs" = (4294967296)
"IOVARendererID" = 17305602
"audio-device-nvalue" = <"Z">
"IOAccelRevision" = 2
"IOCFPlugInTypes" = {"ACCF0000-0000-0000-0000-000a2789904e"="IOAccelerator2D.plugin"}
"audio-device-mvalue" = <04000000>
"IOFBTimingRange" =
00000000: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
00000020: 00 2D 31 01 00 00 00 00 80 EC A7 09 00 00 00 00 00 00 00 00 0F 00 00 00 0F 00 00 00 08 00 00 00 .-1.............................
00000040: 00 00 00 00 FF FF FF FF 00 00 00 00 FF FF FF FF FF 1F 00 00 FF 1F 00 00 00 00 00 00 00 00 00 00 ................................
00000060: 01 01 01 01 01 01 01 01 01 01 01 01 01 01 00 00 00 00 00 00 00 20 00 00 00 00 00 00 FF 1F 00 00 ..................... ..........
00000080: 00 00 00 00 FF 1F 00 00 00 00 00 00 FF 1F 00 00 00 00 00 00 00 0C 00 00 00 00 00 00 FF 1F 00 00 ................................
000000A0: 00 00 00 00 FF 1F 00 00 00 00 00 00 FF 1F 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
000000C0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
000000E0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
"IOFBDetailedTimings" = (<0050008000000000000000000000000000000000300000003804000080070000000000000000000020eed9080000000020eed9080000000020eed908000000008007000018010000580000002c000000380400002d00000004000000050000$
"IOFBCurrentPixelCountReal" = 2475000
"IOGeneralInterest" = "IOCommand is not serializable"
"port-number" = 5
"IOFBHDMIDongleROM" =
00000000: 44 50 2D 48 44 4D 49 20 41 44 41 50 54 4F 52 04 DP-HDMI ADAPTOR.
"EnableLPVP" = 1
}
+-o AppleIntelFramebuffer@2 <class AppleIntelFramebuffer, id 0x1000003a5, registered, matched, active, busy 0 (46 ms), retain 14>
{
"IOI2CTransactionTypes" = 19
"IOFBScalerInfo" =
00000000: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 3E 00 00 00 FF 1F 00 00 FF 1F 00 00 00 00 00 00 ................>...............
00000020: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
"IOPMStrictTreeOrder" = Yes
"AppleIntelMEVABundleName" = "AppleIntelIVBFBVA"
"IOFBDependentIndex" = 2
"IOFBUIScale" = <00000000>
"IOScreenRestoreState" = <00000000>
"IOFBGammaCount" = 1024
"IOFBCLUTDefer" = Yes
"IOFramebufferOpenGLIndex" = 2
"AAPL,DisplayPipe" = <ffff0000>
"IOFBI2CInterfaceInfo" = ({"IOI2CInterfaceID"=0,"IOI2CTransactionTypes"=19})
"connector-type" = <00040000>
"IODisplayParameters" = "IOFramebufferParameterHandler is not serializable"
"IOAccelTypes" = "IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/IGPU@2/IntelAccelerator"
"IOPowerManagement" = {"MaxPowerState"=2,"CurrentPowerState"=2,"CapabilityFlags"=32768,"ChildProxyPowerState"=2,"DriverPowerState"=1}
"IOFBGammaWidth" = 10
"IOFBDependentID" = 4294968223
"IOAccelIndex" = 2
"IOFBWaitCursorFrames" = 29
"IOFBConfig" = {"IOFB0Hz"=Yes,"IOFBModes"=({"ID"=18446744073709551360,"DM"=<010000000100000000000000000000000700000000000000000000000000000000000000>,"AID"=550})}
"IOFBIntegrated" = Yes
"IOFBProbeOptions" = 1025
"IOFBNeedsRefresh" = Yes
"IOFBWaitCursorPeriod" = 33333333
"IOFBTransform" = 0
"IOFBCursorInfo" = ()
"IOFBI2CInterfaceIDs" = (8589934592)
"IOVARendererID" = 17305602
"audio-device-nvalue" = <"Z">
"IOAccelRevision" = 2
"IOCFPlugInTypes" = {"ACCF0000-0000-0000-0000-000a2789904e"="IOAccelerator2D.plugin"}
"audio-device-mvalue" = <04000000>
"IOFBTimingRange" =
00000000: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
00000020: 00 2D 31 01 00 00 00 00 80 DF 17 10 00 00 00 00 00 00 00 00 0F 00 00 00 0F 00 00 00 08 00 00 00 .-1.............................
00000040: 00 00 00 00 FF FF FF FF 00 00 00 00 FF FF FF FF FF 1F 00 00 FF 1F 00 00 00 00 00 00 00 00 00 00 ................................
00000060: 01 01 01 01 01 01 01 01 01 01 01 01 01 01 00 00 00 00 00 00 00 20 00 00 00 00 00 00 FF 1F 00 00 ..................... ..........
00000080: 00 00 00 00 FF 1F 00 00 00 00 00 00 FF 1F 00 00 00 00 00 00 00 0C 00 00 00 00 00 00 FF 1F 00 00 ................................
000000A0: 00 00 00 00 FF 1F 00 00 00 00 00 00 FF 1F 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
000000C0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
000000E0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
"IOGeneralInterest" = "IOCommand is not serializable"
"port-number" = 6
}
+-o AppleIntelFramebuffer@3 <class AppleIntelFramebuffer, id 0x1000003a6, registered, matched, active, busy 0 (471 ms), retain 17>
{
"IOI2CTransactionTypes" = 19
"IOFBScalerInfo" =
00000000: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 3E 00 00 00 FF 1F 00 00 FF 1F 00 00 00 00 00 00 ................>...............
00000020: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
"IOPMStrictTreeOrder" = Yes
"AppleIntelMEVABundleName" = "AppleIntelIVBFBVA"
"av-signal-type" = <08000000>
"IOFBDependentIndex" = 3
"IOFBUIScale" = <01000000>
"IOScreenRestoreState" = <00000000>
"audio-codec-info" = <00010700>
"CEAPixelRepetition" = <00>
"IOFBGammaCount" = 1024
"IOFBCurrentPixelCount" = 2475000
"IOFBCLUTDefer" = Yes
"IOFramebufferOpenGLIndex" = 3
"AAPL,DisplayPipe" = <01000000>
"IOFBI2CInterfaceInfo" = ({"IOI2CInterfaceID"=0,"IOI2CTransactionTypes"=19})
"connector-type" = <00080000>
"IODisplayParameters" = "IOFramebufferParameterHandler is not serializable"
"startup-timing" =
00000000: 00 00 00 00 00 00 00 80 00 30 00 80 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 .........0......................
00000020: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 20 EE D9 08 00 00 00 00 20 EE D9 08 00 00 00 00 ................ ....... .......
00000040: 20 EE D9 08 00 00 00 00 80 07 00 00 18 01 00 00 58 00 00 00 2C 00 00 00 38 04 00 00 2D 00 00 00 ...............X...,...8...-...
00000060: 04 00 00 00 05 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 ................................
00000080: 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
000000A0: 00 00 00 00 00 00 00 00 ........
"IOAccelTypes" = "IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/IGPU@2/IntelAccelerator"
"IOPowerManagement" = {"ChildrenPowerState"=2,"MaxPowerState"=2,"CurrentPowerState"=2,"CapabilityFlags"=32768,"ChildProxyPowerState"=2,"DriverPowerState"=1}
"IOFBCurrentPixelClock" = 148500000
"IOFBGammaWidth" = 10
"IOFBDependentID" = 4294968223
"IOAccelIndex" = 3
"IOFBWaitCursorFrames" = 29
"audio-selector" = <"dp66">
"IOFBConfig" = {"IOFBModes"=({"ID"=18446744071562088448,"DM"=<800700003804000000003c00000000000700100256025001000000000000000000000000>,"TM"=<00500080000000000000000000000000000000000000000000000000000000000000000000$
"CEAModeID" = <10000000>
"IOFBIntegrated" = Yes
"IOFBProbeOptions" = 1025
"IOFBNeedsRefresh" = Yes
"IOFBWaitCursorPeriod" = 33333333
"IOFBTransform" = 0
"IOFBCursorInfo" = (<0100000000010000000100002000000000000000000000000000000000000000000000000400000000000000ffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000$
"IOFBI2CInterfaceIDs" = (12884901888)
"IOVARendererID" = 17305602
"audio-device-nvalue" = <"Z">
"IOAccelRevision" = 2
"IOCFPlugInTypes" = {"ACCF0000-0000-0000-0000-000a2789904e"="IOAccelerator2D.plugin"}
"audio-device-mvalue" = <04000000>
"IOFBTimingRange" =
00000000: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
00000020: 00 2D 31 01 00 00 00 00 00 A3 E1 11 00 00 00 00 00 00 00 00 0F 00 00 00 0F 00 00 00 08 00 00 00 .-1.............................
00000040: 00 00 00 00 FF FF FF FF 00 00 00 00 FF FF FF FF FF 1F 00 00 FF 1F 00 00 00 00 00 00 00 00 00 00 ................................
00000060: 01 01 01 01 01 01 01 01 01 01 01 01 01 01 00 00 00 00 00 00 00 20 00 00 00 00 00 00 FF 1F 00 00 ..................... ..........
00000080: 00 00 00 00 FF 1F 00 00 00 00 00 00 FF 1F 00 00 00 00 00 00 00 0C 00 00 00 00 00 00 FF 1F 00 00 ................................
000000A0: 00 00 00 00 FF 1F 00 00 00 00 00 00 FF 1F 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
000000C0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
000000E0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
"IOFBDetailedTimings" = (<0050008000000000000000000000000000000000000000000000000000000000000000000000000020eed9080000000020eed9080000000020eed908000000008007000018010000580000002c000000380400002d00000004000000050000$
"IOFBCurrentPixelCountReal" = 2475000
"IOGeneralInterest" = "IOCommand is not serializable"
"port-number" = 7
"EnableLPVP" = 1
}
Working on debugging this. Will report back tomorrow.
I don't have duplicate monitors to test myself, but can you try against latest master?
make CCFLAGS=-DDEBUG clean ddcctl
should do the trick.
Oops. I totally forgot about this. Will report back as soon as I can.
No response.
Personal issues made me unable to test. My apologies. The testing results are as follows.
- Executing
make CCFLAGS=-DDEBUG clean ddcctl
rm *.o ddcctl
gcc -DDEBUG -Wall -c -o DDC.o DDC.c
gcc -DDEBUG -Wall -o ddcctl -lobjc -framework IOKit -framework AppKit -framework Foundation DDC.o ddcctl.m
- Executing
ddcctl -d 1 -b 1
The first display lowers its brightness to minimum level.
D: NSScreen #188930901 (1920x1080 0°) 82.00 DPI
D: NSScreen #188930903 (1920x1080 0°) 82.00 DPI
I: found 2 external displays
I: polling display 1's EDID
I: got edid.name: S27C750
D: action: b: 1
D: setting VCP control #16 => 1
- Executing
ddcctl -d 1 -b 100
The first display changes its brightness to maximum level.
D: NSScreen #188930901 (1920x1080 0°) 82.00 DPI
D: NSScreen #188930903 (1920x1080 0°) 82.00 DPI
I: found 2 external displays
I: polling display 1's EDID
I: got edid.name: S27C750
D: action: b: 100
D: setting VCP control #16 => 100
- Executing
ddcctl -d 2 -b 100
The first display lowers its brightness to minimum level.
D: NSScreen #188930901 (1920x1080 0°) 82.00 DPI
D: NSScreen #188930903 (1920x1080 0°) 82.00 DPI
I: found 2 external displays
I: polling display 2's EDID
I: got edid.name: S27C750
D: action: b: 1
D: setting VCP control #16 => 1
- Executing
make displaylist framebuffers
ioreg -c IODisplayConnect -b -f -r -l -i -d 2
+-o display0 <class IORegistryEntry:IOService:IODisplayConnect, id 0x1000050e0, registered, matched, active, busy 0 (1 ms), retain 6>
| {
| }
|
+-o AppleBacklightDisplay <class IORegistryEntry:IOService:IODisplay:IOBacklightDisplay:AppleBacklightDisplay, id 0x1000050e1, registered, matched, active, busy 0 (0 ms), retain 9>
{
"IOClass" = "AppleBacklightDisplay"
"CFBundleIdentifier" = "com.apple.iokit.IOGraphicsFamily"
"IOProviderClass" = "IODisplayConnect"
"DisplayProductID" = 41006
"IODisplayEDID" =
00000000: 00 FF FF FF FF FF FF 00 06 10 2E A0 00 00 00 00 04 19 01 04 A5 21 15 78 02 6F B1 A7 55 4C 9E 25 .....................!.x.o..UL.%
00000020: 0C 50 54 00 00 00 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 EF 83 40 A0 B0 08 34 70 30 20 [email protected]
00000040: 36 00 4B CF 10 00 00 1A 00 00 00 FC 00 43 6F 6C 6F 72 20 4C 43 44 0A 20 20 20 00 00 00 10 00 00 6.K..........Color LCD. ......
00000060: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 D0 ................................
"IODisplayPrefsKey" = "IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/IGPU@2/AppleIntelFramebuffer@0/display0/AppleBacklightDisplay-610-a02e"
"IODisplayGUID" = 436849163854938112
"IOProbeScore" = 3000
"IODisplayParameters" = {"commit"={"reg"=0},"fade-time2"={"min"=0,"max"=10000,"value"=4000},"ggsc"={"min"=0,"max"=65536,"value"=65536},"gsc "={"min"=0,"max"=65536,"value"=65536},"vblm"={"min"=0,"max"=1966$
"IOPowerManagement" = {"CapabilityFlags"=49152,"MaxPowerState"=3,"CurrentPowerState"=3}
"IOMatchCategory" = "IODefaultMatchCategory"
"IODisplayAttributes" = {"IODisplayAttributes"=<676174760000000073676c6604000000726c6f630100000063706220020000006364670080808000676c666400000000>}
"IODisplayConnectFlags" = <00080000>
"DisplayVendorID" = 1552
"DisplayParameterHandlerUsesCharPtr" = Yes
"DisplaySerialNumber" = 0
}
+-o display0 <class IORegistryEntry:IOService:IODisplayConnect, id 0x1000050e4, registered, matched, active, busy 0 (0 ms), retain 6>
| {
| }
|
+-o AppleDisplay <class IORegistryEntry:IOService:IODisplay:AppleDisplay, id 0x1000050e6, registered, matched, active, busy 0 (0 ms), retain 10>
{
"IOClass" = "AppleDisplay"
"CFBundleIdentifier" = "com.apple.iokit.IOGraphicsFamily"
"IOProviderClass" = "IODisplayConnect"
"DisplayProductID" = 2656
"IODisplayEDID" =
00000000: 00 FF FF FF FF FF FF 00 4C 2D 60 0A 57 43 58 5A 22 17 01 03 80 3C 22 78 2A F7 11 A3 56 4F 9E 28 ........L-`.WCXZ"....<"x*...VO.(
00000020: 0F 50 54 BF EF 80 71 4F 81 C0 81 00 81 80 95 00 A9 C0 B3 00 01 01 02 3A 80 18 71 38 2D 40 58 2C .PT...qO...............:..q8-@X,
00000040: 45 00 56 50 21 00 00 1E 01 1D 00 72 51 D0 1E 20 6E 28 55 00 56 50 21 00 00 1E 00 00 00 FD 00 32 E.VP!......rQ.. n(U.VP!........2
00000060: 4B 1E 51 11 00 0A 20 20 20 20 20 20 00 00 00 FC 00 53 32 37 43 37 35 30 0A 20 20 20 20 20 01 90 K.Q... .....S27C750. ..
00000080: 02 03 1A F1 46 90 04 1F 13 03 12 23 09 07 07 83 01 00 00 66 03 0C 00 10 00 80 01 1D 00 BC 52 D0 ....F......#.......f..........R.
000000A0: 1E 20 B8 28 55 40 56 50 21 00 00 1E 8C 0A D0 90 20 40 31 20 0C 40 55 00 56 50 21 00 00 18 8C 0A . .(U@VP!....... @1 [email protected]!.....
000000C0: D0 8A 20 E0 2D 10 10 3E 96 00 56 50 21 00 00 18 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 .. .-..>..VP!...................
000000E0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 61 ...............................a
"IODisplayPrefsKey" = "IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/IGPU@2/AppleIntelFramebuffer@1/display0/AppleDisplay-4c2d-a60"
"IOPowerManagement" = {"CapabilityFlags"=49152,"MaxPowerState"=3,"CurrentPowerState"=3}
"IOProbeScore" = 2000
"IODisplayParameters" = {"bgsc"={"min"=0,"max"=65536,"value"=65536},"pscn"={"min"=8800,"max"=10000,"value"=10000},"rgsc"={"min"=0,"max"=65536,"value"=65536},"cmod"={"min"=0,"max"=4096,"value"=256},"ggsc"=$
"IOMatchCategory" = "IODefaultMatchCategory"
"IODisplayAttributes" = {"IODisplayAttributes"=<676174760000000073676c6600000000726c6f631101000063706220020202006364670080808000676c666401000000>,"IODisplayVSDB030C00"=<100080>}
"IODisplayConnectFlags" = <00000000>
"DisplayVendorID" = 19501
"DisplaySerialNumber" = 1515733847
}
+-o display0 <class IORegistryEntry:IOService:IODisplayConnect, id 0x1000050e8, registered, matched, active, busy 0 (0 ms), retain 6>
| {
| }
|
+-o AppleDisplay <class IORegistryEntry:IOService:IODisplay:AppleDisplay, id 0x1000050ea, registered, matched, active, busy 0 (0 ms), retain 8>
{
"IOClass" = "AppleDisplay"
"CFBundleIdentifier" = "com.apple.iokit.IOGraphicsFamily"
"IOProviderClass" = "IODisplayConnect"
"DisplayProductID" = 2656
"IODisplayEDID" =
00000000: 00 FF FF FF FF FF FF 00 4C 2D 60 0A 57 43 58 5A 22 17 01 03 80 3C 22 78 2A F7 11 A3 56 4F 9E 28 ........L-`.WCXZ"....<"x*...VO.(
00000020: 0F 50 54 BF EF 80 71 4F 81 C0 81 00 81 80 95 00 A9 C0 B3 00 01 01 02 3A 80 18 71 38 2D 40 58 2C .PT...qO...............:..q8-@X,
00000040: 45 00 56 50 21 00 00 1E 01 1D 00 72 51 D0 1E 20 6E 28 55 00 56 50 21 00 00 1E 00 00 00 FD 00 32 E.VP!......rQ.. n(U.VP!........2
00000060: 4B 1E 51 11 00 0A 20 20 20 20 20 20 00 00 00 FC 00 53 32 37 43 37 35 30 0A 20 20 20 20 20 01 90 K.Q... .....S27C750. ..
00000080: 02 03 1A F1 46 90 04 1F 13 03 12 23 09 07 07 83 01 00 00 66 03 0C 00 20 00 80 01 1D 00 BC 52 D0 ....F......#.......f... ......R.
000000A0: 1E 20 B8 28 55 40 56 50 21 00 00 1E 8C 0A D0 90 20 40 31 20 0C 40 55 00 56 50 21 00 00 18 8C 0A . .(U@VP!....... @1 [email protected]!.....
000000C0: D0 8A 20 E0 2D 10 10 3E 96 00 56 50 21 00 00 18 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 .. .-..>..VP!...................
000000E0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 51 ...............................Q
"IODisplayPrefsKey" = "IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/IGPU@2/AppleIntelFramebuffer@3/display0/AppleDisplay-4c2d-a60"
"IOPowerManagement" = {"CapabilityFlags"=49152,"MaxPowerState"=3,"CurrentPowerState"=3}
"IOProbeScore" = 2000
"IODisplayParameters" = {"bgsc"={"min"=0,"max"=65536,"value"=65536},"pscn"={"min"=8800,"max"=10000,"value"=10000},"rgsc"={"min"=0,"max"=65536,"value"=65536},"cmod"={"min"=0,"max"=4096,"value"=256},"ggsc"=$
"IOMatchCategory" = "IODefaultMatchCategory"
"IODisplayAttributes" = {"IODisplayAttributes"=<676174760000000073676c6600000000726c6f631101000063706220020202006364670080808000676c666401000000>,"IODisplayVSDB030C00"=<200080>}
"IODisplayConnectFlags" = <00000000>
"DisplayVendorID" = 19501
"DisplaySerialNumber" = 1515733847
}
ioreg -c IOFramebuffer -k IOFBI2CInterfaceIDs -b -f -l -r -d 1
+-o AppleIntelFramebuffer@0 <class AppleIntelFramebuffer, id 0x1000003a5, registered, matched, active, busy 0 (56 ms), retain 19>
{
"IOI2CTransactionTypes" = 19
"IOFBScalerInfo" =
00000000: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0E 00 00 00 FF 1F 00 00 FF 1F 00 00 00 00 00 00 ................................
00000020: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
"IOPMStrictTreeOrder" = Yes
"AppleIntelMEVABundleName" = "AppleIntelIVBFBVA"
"av-signal-type" = <00000000>
"IOFBDependentIndex" = 0
"IOFBUIScale" = <02000000>
"audio-codec-info" = <00000000>
"IOFBMemorySize" = 268435456
"boot-gamma-restored" = <00000000>
"IOScreenRestoreState" = <00000000>
"IOFBGammaCount" = 1024
"IOFBCurrentPixelCount" = 5630080
"IOFBCLUTDefer" = Yes
"IOFramebufferOpenGLIndex" = 0
"AAPL,DisplayPipe" = <00000000>
"IOFBI2CInterfaceInfo" = ({"IOI2CInterfaceID"=0,"IOI2CTransactionTypes"=19})
"connector-type" = <02000000>
"IODisplayParameters" = "IOFramebufferParameterHandler is not serializable"
"startup-timing" =
00000000: 00 00 00 00 00 00 00 80 00 70 00 80 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 .........p......................
00000020: 00 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 F0 A7 21 14 00 00 00 00 F0 A7 21 14 00 00 00 00 ..................!.......!.....
00000040: F0 A7 21 14 00 00 00 00 40 0B 00 00 A0 00 00 00 30 00 00 00 20 00 00 00 08 07 00 00 34 00 00 00 [email protected]... .......4...
00000060: 03 00 00 00 06 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 ................................
00000080: 00 00 00 00 00 00 00 00 02 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
000000A0: 00 00 00 00 00 00 00 00 ........
"AAPL,boot-display" = Yes
"IOAccelTypes" = "IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/IGPU@2/IntelAccelerator"
"built-in" = <>
"IOPowerManagement" = {"ChildrenPowerState"=2,"MaxPowerState"=2,"CurrentPowerState"=2,"CapabilityFlags"=32768,"ChildProxyPowerState"=2,"DriverPowerState"=1}
"IOFBCurrentPixelClock" = 337750000
"IOFBGammaWidth" = 10
"IOFBDependentID" = 4294968225
"IOAccelIndex" = 0
"IOFBWaitCursorFrames" = 29
"IOFBConfig" = {"IOFBModes"=({"ID"=18446744071562072064,"DM"=<400b00000807000082fd3b0000000000070000024b01cf00000000000000000000000000>,"TM"=<0010008000000000000000000000000000000000000000000000000000000000$
"IOFBIntegrated" = Yes
"IOFBProbeOptions" = 1025
"IOFBNeedsRefresh" = No
"IOFBWaitCursorPeriod" = 33333333
"IOFBTransform" = 0
"IOFBCursorInfo" = (<0100000000010000000100002000000000000000000000000000000000000000000000000400000000000000ffffff0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000$
"IOFBI2CInterfaceIDs" = (0)
"audio-device-nvalue" = <"Z">
"IOAccelRevision" = 2
"IOCFPlugInTypes" = {"ACCF0000-0000-0000-0000-000a2789904e"="IOAccelerator2D.plugin"}
"audio-device-mvalue" = <04000000>
"IOVARendererID" = 17305602
"IOFBTimingRange" =
00000000: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
00000020: 00 2D 31 01 00 00 00 00 00 0F BE 14 00 00 00 00 00 00 00 00 0F 00 00 00 0F 00 00 00 08 00 00 00 .-1.............................
00000040: 00 00 00 00 FF FF FF FF 00 00 00 00 FF FF FF FF FF 1F 00 00 FF 1F 00 00 00 00 00 00 00 00 00 00 ................................
00000060: 01 01 01 01 01 01 01 01 01 01 01 01 01 01 00 00 00 00 00 00 00 20 00 00 00 00 00 00 FF 1F 00 00 ..................... ..........
00000080: 00 00 00 00 FF 1F 00 00 00 00 00 00 FF 1F 00 00 00 00 00 00 00 0C 00 00 00 00 00 00 FF 1F 00 00 ................................
000000A0: 00 00 00 00 FF 1F 00 00 00 00 00 00 FF 1F 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
000000C0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
000000E0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
"IOFBDetailedTimings" = (<00100080000000000000000000000000000000000000000000000000000000000000000001000000f0a7211400000000f0a7211400000000f0a7211400000000400b0000a0000000300000002000000008070000340000000300$
"IOFBCurrentPixelCountReal" = 5630080
"IOGeneralInterest" = "IOCommand is not serializable"
"port-number" = 0
"EnableLPVP" = 1
}
+-o AppleIntelFramebuffer@1 <class AppleIntelFramebuffer, id 0x1000003a6, registered, matched, active, busy 0 (109 ms), retain 17>
{
"IOI2CTransactionTypes" = 19
"IOFBScalerInfo" =
00000000: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 3E 00 00 00 FF 1F 00 00 FF 1F 00 00 00 00 00 00 ................>...............
00000020: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
"IOPMStrictTreeOrder" = Yes
"AppleIntelMEVABundleName" = "AppleIntelIVBFBVA"
"av-signal-type" = <08000000>
"IOFBDependentIndex" = 1
"IOFBUIScale" = <01000000>
"IOScreenRestoreState" = <00000000>
"audio-codec-info" = <00010500>
"CEAPixelRepetition" = <00>
"IOFBGammaCount" = 1024
"IOFBCurrentPixelCount" = 2475000
"IOFBCLUTDefer" = Yes
"IOFramebufferOpenGLIndex" = 1
"AAPL,DisplayPipe" = <01000000>
"IOFBI2CInterfaceInfo" = ({"IOI2CInterfaceID"=0,"IOI2CTransactionTypes"=19})
"connector-type" = <00040000>
"IODisplayParameters" = "IOFramebufferParameterHandler is not serializable"
"startup-timing" =
00000000: 00 00 00 00 00 00 00 80 00 50 00 80 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 .........P......................
00000020: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 20 EE D9 08 00 00 00 00 20 EE D9 08 00 00 00 00 ................ ....... .......
00000040: 20 EE D9 08 00 00 00 00 80 07 00 00 18 01 00 00 58 00 00 00 2C 00 00 00 38 04 00 00 2D 00 00 00 ...............X...,...8...-...
00000060: 04 00 00 00 05 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 ................................
00000080: 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
000000A0: 00 00 00 00 00 00 00 00 ........
"IOAccelTypes" = "IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/IGPU@2/IntelAccelerator"
"IOPowerManagement" = {"ChildrenPowerState"=2,"MaxPowerState"=2,"CurrentPowerState"=2,"CapabilityFlags"=32768,"ChildProxyPowerState"=2,"DriverPowerState"=1}
"IOFBCurrentPixelClock" = 148500000
"IOFBGammaWidth" = 10
"IOFBDependentID" = 4294968225
"IOAccelIndex" = 1
"IOFBWaitCursorFrames" = 29
"audio-selector" = <"dp66">
"IOFBConfig" = {"IOFBModes"=({"ID"=18446744071562072064,"DM"=<800700003804000000003c00000000000700100256025001000000000000000000000000>,"TM"=<0010008000000000000000000000000000000000000000000000000000000000$
"CEAModeID" = <10000000>
"IOFBIntegrated" = Yes
"IOFBProbeOptions" = 1025
"IOFBNeedsRefresh" = Yes
"IOFBWaitCursorPeriod" = 33333333
"IOFBTransform" = 0
"IOFBCursorInfo" = (<0100000000010000000100002000000000000000000000000000000000000000000000000400000000000000ffffff0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000$
"IOFBI2CInterfaceIDs" = (4294967296)
"IOVARendererID" = 17305602
"audio-device-nvalue" = <"Z">
"IOAccelRevision" = 2
"IOCFPlugInTypes" = {"ACCF0000-0000-0000-0000-000a2789904e"="IOAccelerator2D.plugin"}
"audio-device-mvalue" = <04000000>
"IOFBTimingRange" =
00000000: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
00000020: 00 2D 31 01 00 00 00 00 80 EC A7 09 00 00 00 00 00 00 00 00 0F 00 00 00 0F 00 00 00 08 00 00 00 .-1.............................
00000040: 00 00 00 00 FF FF FF FF 00 00 00 00 FF FF FF FF FF 1F 00 00 FF 1F 00 00 00 00 00 00 00 00 00 00 ................................
00000060: 01 01 01 01 01 01 01 01 01 01 01 01 01 01 00 00 00 00 00 00 00 20 00 00 00 00 00 00 FF 1F 00 00 ..................... ..........
00000080: 00 00 00 00 FF 1F 00 00 00 00 00 00 FF 1F 00 00 00 00 00 00 00 0C 00 00 00 00 00 00 FF 1F 00 00 ................................
000000A0: 00 00 00 00 FF 1F 00 00 00 00 00 00 FF 1F 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
000000C0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
000000E0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
"IOFBDetailedTimings" = (<0010008000000000000000000000000000000000000000000000000000000000000000000000000020eed9080000000020eed9080000000020eed908000000008007000018010000580000002c000000380400002d0000000400$
"IOFBCurrentPixelCountReal" = 2475000
"IOGeneralInterest" = "IOCommand is not serializable"
"port-number" = 5
"IOFBHDMIDongleROM" =
00000000: 44 50 2D 48 44 4D 49 20 41 44 41 50 54 4F 52 04 DP-HDMI ADAPTOR.
"EnableLPVP" = 1
}
+-o AppleIntelFramebuffer@2 <class AppleIntelFramebuffer, id 0x1000003a7, registered, matched, active, busy 0 (9 ms), retain 15>
{
"IOI2CTransactionTypes" = 19
"IOFBScalerInfo" =
00000000: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 3E 00 00 00 FF 1F 00 00 FF 1F 00 00 00 00 00 00 ................>...............
00000020: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
"IOPMStrictTreeOrder" = Yes
"AppleIntelMEVABundleName" = "AppleIntelIVBFBVA"
"IOFBDependentIndex" = 2
"IOFBUIScale" = <00000000>
"IOScreenRestoreState" = <00000000>
"IOFBGammaCount" = 1024
"IOFBCLUTDefer" = Yes
"IOFramebufferOpenGLIndex" = 2
"AAPL,DisplayPipe" = <ffff0000>
"IOFBI2CInterfaceInfo" = ({"IOI2CInterfaceID"=0,"IOI2CTransactionTypes"=19})
"connector-type" = <00040000>
"IODisplayParameters" = "IOFramebufferParameterHandler is not serializable"
"IOAccelTypes" = "IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/IGPU@2/IntelAccelerator"
"IOPowerManagement" = {"MaxPowerState"=2,"CurrentPowerState"=2,"CapabilityFlags"=32768,"ChildProxyPowerState"=2,"DriverPowerState"=1}
"IOFBGammaWidth" = 10
"IOFBDependentID" = 4294968225
"IOAccelIndex" = 2
"IOFBWaitCursorFrames" = 29
"IOFBConfig" = {"IOFB0Hz"=Yes,"IOFBModes"=({"ID"=18446744073709551360,"DM"=<010000000100000000000000000000000700000000000000000000000000000000000000>,"AID"=550})}
"IOFBIntegrated" = Yes
"IOFBProbeOptions" = 1025
"IOFBNeedsRefresh" = Yes
"IOFBWaitCursorPeriod" = 33333333
"IOFBTransform" = 0
"IOFBCursorInfo" = ()
"IOFBI2CInterfaceIDs" = (8589934592)
"IOVARendererID" = 17305602
"audio-device-nvalue" = <"Z">
"IOAccelRevision" = 2
"IOCFPlugInTypes" = {"ACCF0000-0000-0000-0000-000a2789904e"="IOAccelerator2D.plugin"}
"audio-device-mvalue" = <04000000>
"IOFBTimingRange" =
00000000: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
00000020: 00 2D 31 01 00 00 00 00 80 DF 17 10 00 00 00 00 00 00 00 00 0F 00 00 00 0F 00 00 00 08 00 00 00 .-1.............................
00000040: 00 00 00 00 FF FF FF FF 00 00 00 00 FF FF FF FF FF 1F 00 00 FF 1F 00 00 00 00 00 00 00 00 00 00 ................................
00000060: 01 01 01 01 01 01 01 01 01 01 01 01 01 01 00 00 00 00 00 00 00 20 00 00 00 00 00 00 FF 1F 00 00 ..................... ..........
00000080: 00 00 00 00 FF 1F 00 00 00 00 00 00 FF 1F 00 00 00 00 00 00 00 0C 00 00 00 00 00 00 FF 1F 00 00 ................................
000000A0: 00 00 00 00 FF 1F 00 00 00 00 00 00 FF 1F 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
000000C0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
000000E0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
"IOGeneralInterest" = "IOCommand is not serializable"
"port-number" = 6
}
+-o AppleIntelFramebuffer@3 <class AppleIntelFramebuffer, id 0x1000003a8, registered, matched, active, busy 0 (92 ms), retain 17>
{
"IOI2CTransactionTypes" = 19
"IOFBScalerInfo" =
00000000: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 3E 00 00 00 FF 1F 00 00 FF 1F 00 00 00 00 00 00 ................>...............
00000020: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
"IOPMStrictTreeOrder" = Yes
"AppleIntelMEVABundleName" = "AppleIntelIVBFBVA"
"av-signal-type" = <08000000>
"IOFBDependentIndex" = 3
"IOFBUIScale" = <01000000>
"IOScreenRestoreState" = <00000000>
"audio-codec-info" = <00010700>
"CEAPixelRepetition" = <00>
"IOFBGammaCount" = 1024
"IOFBCurrentPixelCount" = 2475000
"IOFBCLUTDefer" = Yes
"IOFramebufferOpenGLIndex" = 3
"AAPL,DisplayPipe" = <02000000>
"IOFBI2CInterfaceInfo" = ({"IOI2CInterfaceID"=0,"IOI2CTransactionTypes"=19})
"connector-type" = <00080000>
"IODisplayParameters" = "IOFramebufferParameterHandler is not serializable"
"startup-timing" =
00000000: 00 00 00 00 00 00 00 80 00 70 00 80 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 .........p......................
00000020: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 20 EE D9 08 00 00 00 00 20 EE D9 08 00 00 00 00 ................ ....... .......
00000040: 20 EE D9 08 00 00 00 00 80 07 00 00 18 01 00 00 58 00 00 00 2C 00 00 00 38 04 00 00 2D 00 00 00 ...............X...,...8...-...
00000060: 04 00 00 00 05 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 ................................
00000080: 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
000000A0: 00 00 00 00 00 00 00 00 ........
"IOAccelTypes" = "IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/IGPU@2/IntelAccelerator"
"IOPowerManagement" = {"ChildrenPowerState"=2,"MaxPowerState"=2,"CurrentPowerState"=2,"CapabilityFlags"=32768,"ChildProxyPowerState"=2,"DriverPowerState"=1}
"IOFBCurrentPixelClock" = 148500000
"IOFBGammaWidth" = 10
"IOFBDependentID" = 4294968225
"IOAccelIndex" = 3
"IOFBWaitCursorFrames" = 29
"audio-selector" = <"dp66">
"IOFBConfig" = {"IOFBModes"=({"ID"=18446744071562072064,"DM"=<800700003804000000003c00000000000700100256025001000000000000000000000000>,"TM"=<0010008000000000000000000000000000000000000000000000000000000000$
"CEAModeID" = <10000000>
"IOFBIntegrated" = Yes
"IOFBProbeOptions" = 1025
"IOFBNeedsRefresh" = Yes
"IOFBWaitCursorPeriod" = 33333333
"IOFBTransform" = 0
"IOFBCursorInfo" = (<0100000000010000000100002000000000000000000000000000000000000000000000000400000000000000ffffff0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000$
"IOFBI2CInterfaceIDs" = (12884901888)
"IOVARendererID" = 17305602
"audio-device-nvalue" = <"Z">
"IOAccelRevision" = 2
"IOCFPlugInTypes" = {"ACCF0000-0000-0000-0000-000a2789904e"="IOAccelerator2D.plugin"}
"audio-device-mvalue" = <04000000>
"IOFBTimingRange" =
00000000: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
00000020: 00 2D 31 01 00 00 00 00 00 A3 E1 11 00 00 00 00 00 00 00 00 0F 00 00 00 0F 00 00 00 08 00 00 00 .-1.............................
00000040: 00 00 00 00 FF FF FF FF 00 00 00 00 FF FF FF FF FF 1F 00 00 FF 1F 00 00 00 00 00 00 00 00 00 00 ................................
00000060: 01 01 01 01 01 01 01 01 01 01 01 01 01 01 00 00 00 00 00 00 00 20 00 00 00 00 00 00 FF 1F 00 00 ..................... ..........
00000080: 00 00 00 00 FF 1F 00 00 00 00 00 00 FF 1F 00 00 00 00 00 00 00 0C 00 00 00 00 00 00 FF 1F 00 00 ................................
000000A0: 00 00 00 00 FF 1F 00 00 00 00 00 00 FF 1F 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
000000C0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
000000E0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
"IOFBDetailedTimings" = (<0010008000000000000000000000000000000000000000000000000000000000000000000000000020eed9080000000020eed9080000000020eed908000000008007000018010000580000002c000000380400002d0000000400$
"IOFBCurrentPixelCountReal" = 2475000
"IOGeneralInterest" = "IOCommand is not serializable"
"port-number" = 7
"EnableLPVP" = 1
}
====
Unfortunately, the problem seems to persist. If I can be of any help, feel free to ask. I will make sure to reply promptly (this time).
When I use a debug build, I can see the exact serial numbers of displays. Your output is missing this information.
$ make CCFLAGS=-DDEBUG clean ddcctl
rm *.o ddcctl
gcc -DDEBUG -Wall -c -o DDC.o DDC.c
gcc -DDEBUG -Wall -o ddcctl -lobjc -framework IOKit -framework AppKit -framework Foundation DDC.o ddcctl.m
$ ./ddcctl -d 1
2017-02-15 10:14:05.820 ddcctl[5706:256999] D: NSScreen #724067663 (1920x1200 0°) 94.00 DPI
2017-02-15 10:14:05.821 ddcctl[5706:256999] D: NSScreen #725365521 (1200x1920 90°) 94.00 DPI
2017-02-15 10:14:05.822 ddcctl[5706:256999] I: found 2 external displays
2017-02-15 10:14:05.822 ddcctl[5706:256999] I: polling display 1's EDID
Framebuffer: NVDA
IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/P0P2@1/IOPP/GFX0@0/NVDA,Display-B@1/NVDA/display0/AppleDisplay
VN:4268 PN:41144 SN:827083596 UN:3 IN:15619 Serial:
2017-02-15 10:14:05.836 ddcctl[5706:256999] I: got edid.serial: CFV9N6221LKL
2017-02-15 10:14:05.836 ddcctl[5706:256999] I: got edid.name: DELL U2415
I just executed the command again after a reinstallation. Even when hard-coded, the entire serial-number line is still not displayed, only the name. I looked into displayList information, both displays report the same serial number: 1515733847
.
EDIT: Other than that, my output is has the same amount of information as yours. EDIT 2: Thanks for reopening this. I really appreciate your work on this.
Unfortunately if the serial numbers are identical then there is no way for ddcctl to tell them apart at the IOFramebuffer level.
I do not know why you cannot see debug information, please get it exactly as I have shown, without installation.
Framebuffer: NVDA IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/P0P2@1/IOPP/GFX0@0/NVDA,Display-B@1/NVDA/display0/AppleDisplay VN:4268 PN:41144 SN:827083596 UN:3 IN:15619 Serial:
That debug output exists specifically to help someone else to hack a solution up for these identical-serial monitors that I don't personally have access to.
Here is the debug output with a similar (dual identical monitors) setup:
❯ make CCFLAGS=-DDEBUG clean ddcctl
rm: cannot remove '*.o': No such file or directory
rm *.o ddcctl
rm: cannot remove 'ddcctl': No such file or directory
gcc -DDEBUG -Wall -c -o DDC.o DDC.c
make: [Makefile:29: clean] Error 1 (ignored)
gcc -DDEBUG -Wall -o ddcctl -lobjc -framework IOKit -framework AppKit -framework Foundation DDC.o ddcctl.m
and debug run for first display:
~/source/system/ddcctl master*
❯ ./ddcctl -d 1
2017-05-15 06:08:09.361 ddcctl[5426:1906618] D: NSScreen #188936772 (2560x1440 0°) 109.00 DPI
2017-05-15 06:08:09.362 ddcctl[5426:1906618] D: NSScreen #188936771 (2560x1440 0°) 109.00 DPI
2017-05-15 06:08:09.362 ddcctl[5426:1906618] I: found 2 external displays
2017-05-15 06:08:09.362 ddcctl[5426:1906618] I: polling display 1's EDID
Framebuffer: NVDA
IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/P0P2@1/IOPP/GFX0@0/NVDA,Display-B@1/NVDA/display0/AppleDisplay
VN:19501 PN:3017 SN:0 UN:4 IN:14851 Serial:
2017-05-15 06:08:09.380 ddcctl[5426:1906618] I: got edid.name: S27D850
and the output using the second display:
~/source/system/ddcctl master*
❯ ./ddcctl -d 2
2017-05-15 06:08:30.479 ddcctl[5490:1912083] D: NSScreen #188936772 (2560x1440 0°) 109.00 DPI
2017-05-15 06:08:30.479 ddcctl[5490:1912083] D: NSScreen #188936771 (2560x1440 0°) 109.00 DPI
2017-05-15 06:08:30.479 ddcctl[5490:1912083] I: found 2 external displays
2017-05-15 06:08:30.479 ddcctl[5490:1912083] I: polling display 2's EDID
Framebuffer: NVDA
IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/P0P2@1/IOPP/GFX0@0/NVDA,Display-B@1/NVDA/display0/AppleDisplay
VN:19501 PN:3017 SN:0 UN:3 IN:14851 Serial:
2017-05-15 06:08:30.492 ddcctl[5490:1912083] I: got edid.name: S27D850
Essentially you are right that at the frame-buffer level you cannot differentiate between the two displays, with the given CGDisplayID properties. The problematic method is the IOFramebufferPortFromCGDisplayID
in DDC.c
which returns the first frame-buffer matching the CGDisplayID, where in fact there are two frame-buffers matching the properties of the given GCDisplayID. Besides the different address in the ioreg tree:
"IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/P0P2@1/IOPP/GFX0@0/NVDA,Display-B@1/NVDA/display0/AppleDisplay-4c2d-bc9"
"IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/P0P2@1/IOPP/GFX0@0/NVDA,Display-C@2/NVDA/display0/AppleDisplay-4c2d-bc9"
I am still to find another distinctive property that could help in choosing the correct frame-buffer for the corresponding display. The way I went about it (dirty hack) that only works in this specific case, was to just ignore the first result and converge on the second result for that displayID. (hint: the fdisp
counter variable)
It seems that WindowServer maintains a dictionary of displays, linking them with their device paths:
$ PlistBuddy -c "Print DisplaySets:0:0:IODisplayLocation" /Library/Preferences/com.apple.windowserver.plist
IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/IXVE@10/IOPP/IGPU@0/NVDA,Display-A@0/NVDATesla
working on changes to use this derived IOTree location to inform the framebuffer matching.
This is by no means an adequate fix, but maybe this will help someone else debugging or potentially properly fixing this behavior:
I've got two satellite monitors of the same brand & model and started experiencing the same issue yesterday. I was sure ddcctl was working perfectly fine a while back; nothing of the setup had changed at all since my return.
In a poor man's attempt at restoring an older state, I tried some of the older ddcctl versions. – And sure enough, the latest commit in which ddcctl had no issue dealing with identical monitors (for me anyway) was eeab3c21d84eeb607031dea32e21cf36ee2f7050
. Any future state I tried failed.
Albeit two warnings are thrown during make install
(a fix of which, I reckon, was attempted in the following commit), ddcctl nonetheless appears to be running just fine here.
Perhaps someone with more insight can review the changes made after this commit, compare the new & old way of signaling the right monitor and either revert or re-implement the old method as optional fallback?
TL;DR: For those struggling with the same issue, see if ddcclt @ commit eeab3c21d84eeb607031dea32e21cf36ee2f7050
from Aug 16, 2016 is working for you (granted you don't rely on any feature added later).
And sure enough, another begging to revert to calling an Apple deprecated method that could disappear at any time. Sorry, not doing it here, that does not fix this defect long-term. Fork is your friend?
@kfix I was not begging, I was hardly even requesting. I have zero knowledge of C (or derivatives thereof), so I can't effectively contribute or fork. – I was merely trying to provide feedback to anyone more capable than me, in case someone picked up this project more recently. Likewise, I was recommending anyone, who does experience this bug, may want to try an older version and see if it works for them (given that it worked for me in the past).
Please don't get me wrong. I am more than grateful for the time and effort you have put into this project and for making it accessible on GitHub. – Being able to automate my monitor's brightness & contrast throughout the day has had a huge positive impact on my programming life.
I am certain you deprecated and replaced the previous method for a good reason (as you just mentioned in your post above). It is unfortunate that the newer method is currently showing this unexpected behavior on some monitor setups with identical models. Thus I will for now be sticking with a deprecated but (currently) fully functional ddcctl than no ddcctl at all or a version that has been future-proofed but is sadly semi-functional on my setup. – Should an updated version ever be published that addresses this behavior, I'll be sure to praise that day & whoever addressed it and update in a heartbeat.
I am sorry I cannot do more than to provide the feedback above and offer to test future versions.
Thanks so much for everything.
@Bird-Kid You’ve suggested the correct path for vendors of my program catering to mirror monitorerers: fork from it at that old rev, but prepare to be broken hard at some future OSX release.
Detecting an error in these calls and implementing both as failovers for each other ... how about a patch if it’s so simple?
This is a fun-time personal GitHub project so I do demand patches from fix demanders! The bug report is already detailed with loggings.
figuring how to get this right in modern & future OSX is the goal in master branch and I’m sure there are commercial products that have figured this out on their own.
To all that would reply: I know dual monitors doesn’t work 100%, tell me how to fix it without using the old deprecated call.
Hey @kfix, I've been looking into this issue yesterday, but couldn't find a solution either. But I thought sending the request to all matching displays might make this shortcoming in Apple's APIs less annoying for people with a similar setup. Here's a PR if you think that'd be ok: #38
Thanks for building ddcctl! :)
So I think I'm just going to give up on trying to convert NSDisplays to IOFramebuffers via CGDisplayID.
It seems the kIOFBDependentIndexKey
& kIOFBDependentIDKey
from make framebuffers
could be a stable index.
https://github.com/aosm/IOKitUser/blob/master/graphics.subproj/IOGraphicsLib.c#L55
https://opensource.apple.com/source/IOGraphics/IOGraphics-515.3/IOGraphicsFamily/IOKit/graphics/IOFramebuffer.h
Perhaps it even matches with the numerical list of NSDisplays in most cases?
need to investigate thisIndex
for confirmation
I also have this issue with identical monitors. @stroborobo 's idea to set both monitors at once works for me and seems like a decent "middle ground". Even though individual control would be great.
Its an old thread but I posting here just in case. Does anybody have a workaround for this issue?
I am using ddcctl from master branch on Mac OS 10.14.6
ddcctl -d 1
D: NSScreen #731409346 (2560x1440 0°) 109.00 DPI
D: NSScreen #731409355 (2560x1440 0°) 109.00 DPI
I: found 2 external displays
I: polling display 1's EDID
I: got edid.name: LEN P27h-10
ddcctl -d 2
D: NSScreen #731409346 (2560x1440 0°) 109.00 DPI
D: NSScreen #731409355 (2560x1440 0°) 109.00 DPI
I: found 2 external displays
I: polling display 2's EDID
I: got edid.name: LEN P27h-10
@theogq The workaround from my fork (#38) still works fine in Mojave. So if you're ok with updating both displays at the same time, you could use that.
Thank you for the reply @stroborobo Tested it and it work. I have to re-arrange my input cables but its good for now.
Thank you for the fork.
Thanks @kfix for the original build also :D
Hi,
I think I found a fix / workaround for this, which I've implemented in my app.
Instead of comparing serial numbers, which are often wrong, I try to extract the unit number of the display from the display location field in the info dictionary for the framebuffer port (it seems to be the number just after the last @ sign) and then I compare it with CGDisplayUnitNumber for the display ID.
I've tested this with a few users, and it seems to work for them, so I think it should be alright, although I am nowhere near an expert on IOKit, so perhaps there is some scenario where this might fail.
EDIT: Unfortunately, I spoke too soon, this does not work for everybody, see this issue.
FYI @fnesveda your app is the only that works with my identical Planar IX2790's so the fix is an improvement over others!
I have the same problem with two identical HP displays. If anyone has any ideas for a proper fix I am happy to test. I'm not an apply developer (much) but I do C and makefiles just fine. Is this the best suggested answer at this point?
@gherlein If your use-case does not require individual control of both of your monitors, and you're instead fine with only ever changing both simultaneously, I can recommend stroborobo's fork. I've been using it for a while now without any issues. If you do need to control both identical monitors independently, please ignore this post.
Pinging this. Any ideas when one needs independent control?
Its not up to me. Blame Apple! Their APIs do not provide stable indexes of displays-by-port.
Locking the thread.
Please retest against master to verify this is fixed.
Works for me, thank you very much @kfix! <3
I can also confirm this fix also works for me on dual BenQ PD3220U that previously did not work.
Current version works for a pair of Lenovo P27h-10 over USB-C.
Thank you for your work @kfix :D