Giter VIP home page Giter VIP logo

Comments (33)

kfix avatar kfix commented on August 17, 2024 2

@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.

from ddcctl.

stevencorona avatar stevencorona commented on August 17, 2024 2

FYI @fnesveda your app is the only that works with my identical Planar IX2790's so the fix is an improvement over others!

from ddcctl.

ameesme avatar ameesme commented on August 17, 2024 1

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.

from ddcctl.

kfix avatar kfix commented on August 17, 2024 1

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

from ddcctl.

stroborobo avatar stroborobo commented on August 17, 2024 1

@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.

from ddcctl.

kfix avatar kfix commented on August 17, 2024 1

Please retest against master to verify this is fixed.

from ddcctl.

stroborobo avatar stroborobo commented on August 17, 2024 1

Works for me, thank you very much @kfix! <3

from ddcctl.

ndrwstn avatar ndrwstn commented on August 17, 2024 1

I can also confirm this fix also works for me on dual BenQ PD3220U that previously did not work.

from ddcctl.

theok-nice avatar theok-nice commented on August 17, 2024 1

Current version works for a pair of Lenovo P27h-10 over USB-C.

Thank you for your work @kfix :D

from ddcctl.

ameesme avatar ameesme commented on August 17, 2024

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
    }

from ddcctl.

ameesme avatar ameesme commented on August 17, 2024

Working on debugging this. Will report back tomorrow.

from ddcctl.

kfix avatar kfix commented on August 17, 2024

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.

from ddcctl.

ameesme avatar ameesme commented on August 17, 2024

Oops. I totally forgot about this. Will report back as soon as I can.

from ddcctl.

kfix avatar kfix commented on August 17, 2024

No response.

from ddcctl.

ameesme avatar ameesme commented on August 17, 2024

Personal issues made me unable to test. My apologies. The testing results are as follows.

  1. 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
  1. 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
  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
  1. 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
  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).

from ddcctl.

kfix avatar kfix commented on August 17, 2024

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

from ddcctl.

kfix avatar kfix commented on August 17, 2024

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.

from ddcctl.

tmaone avatar tmaone commented on August 17, 2024

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)

from ddcctl.

kfix avatar kfix commented on August 17, 2024

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.

from ddcctl.

echocrow avatar echocrow commented on August 17, 2024

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).

from ddcctl.

kfix avatar kfix commented on August 17, 2024

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?

from ddcctl.

echocrow avatar echocrow commented on August 17, 2024

@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.

from ddcctl.

stroborobo avatar stroborobo commented on August 17, 2024

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! :)

from ddcctl.

adrianocr avatar adrianocr commented on August 17, 2024

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.

from ddcctl.

theogq avatar theogq commented on August 17, 2024

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

from ddcctl.

theogq avatar theogq commented on August 17, 2024

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

from ddcctl.

fnesveda avatar fnesveda commented on August 17, 2024

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.

from ddcctl.

gherlein avatar gherlein commented on August 17, 2024

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?

from ddcctl.

echocrow avatar echocrow commented on August 17, 2024

@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.

from ddcctl.

fserb avatar fserb commented on August 17, 2024

Pinging this. Any ideas when one needs independent control?

from ddcctl.

kfix avatar kfix commented on August 17, 2024

Its not up to me. Blame Apple!
Their APIs do not provide stable indexes of displays-by-port.

Locking the thread.

from ddcctl.

kfix avatar kfix commented on August 17, 2024

I still don't own two identical monitors to test so I'm taking the feedback at full value.
There is another means of inferring distinct ports for duplicate monitors from the unit number embedded in their CGDisplayLocation.
If Apple really does kill the IOFramebufferPortFromCGDisplayID(CGDirectDisplayID someday, might need to adopt this method to keep dupes addressable:

from ddcctl.

theok-nice avatar theok-nice commented on August 17, 2024

I don't know if this any help or not, but with m1 macbook I found an alternative implementation : https://github.com/waydabber/m1ddc . I don't want to be disrespectful to all the work put into this repo oc.

It works for the most part - you can manage the two identical monitors consistently.

from ddcctl.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.