rockowitz / ddcutil

Control monitor settings using DDC/CI and USB
http://www.ddcutil.com
GNU General Public License v2.0
911 stars 38 forks source link

LG 29UM69G fails switching input #100

Open jonpas opened 4 years ago

jonpas commented 4 years ago

LG 29UM69G fails at switching monitor inputs. I did not try other capabilities. Performing $ ddcutil --display 2 setvcp 60 0x[0f|11] simply flashes the screen, but nothing changes.

$ ddcutil detect
...
Display 2
   I2C bus:             /dev/i2c-6
   EDID synopsis:
      Mfg id:           GSM
      Model:            LG ULTRAWIDE
      Serial number:    
      Manufacture year: 2019
      EDID version:     1.3
   VCP version:         2.1

There is no Supports DDC: [true|false] in the output.

$ ddcutil environment shows all permissions are correct (read & write).

$ ddcutil --display 2 getvcp 60
VCP code 0x60 (Input Source                  ): Invalid value (sl=0x00)

This shows up correctly as VGA-1 (sl=0x01) for display 1 (secondary monitor).

ClickMonitorDDC on Windows has the same issue of reporting 0x00 and not being able to switch.

$ ddcutil capabilities --display 2 --verbose
...
Unparsed capabilities string: (prot(monitor)type(lcd)UM69cmds(01 02 03 0C E3 F3)vcp(02 04 05 08 10 12 14(05 08 0B ) 16 18 1A 52 60( 11 0F 10) AC AE B2 B6 C0 C6 C8 C9 D6(01 04) DF 62 8D F4 F5(01 02 03 04) F6(00 01 02) 4D 4E 4F 15(01 06 11 13 14 15 18 19 20 22 23 24 28 29 32 48) F7(00 01 02 03) F8(00 01) F9 E4 E5 E6 E7 E8 E9 EA EB EF FA(00 01) FD(00 01) FE(00 01 02) FF)mccs_ver(2.1)mswhql(1))
...
   Feature: 60 (Input Source)
      Values (unparsed):  11 0F 10
      Values (  parsed):
         0f: DisplayPort-1
         10: DisplayPort-2
         11: HDMI-1

Both monitors are connected to both an integrated GPU (Intel CPU) and dedicated GPU (GTX 1060) in the following way (VFIO setup):

Thank you in advance!

uhlat commented 3 years ago

Same problem with the 32QN600-B (manufactured in week 3/2021)

Is there a way to extract the firmware image for analysis without resorting to physical means?

uhlat commented 3 years ago

I can add and confirm the LG 32GP850-B which has the same issue (manufactured in week 4/2021)

rockowitz commented 3 years ago

Thanks for sharing the the information about the LG monitors.

The only way I can think of to obtain the firmware would be if LG provided a firmware updater. Presumably the program would save the old firmware.

On 06/25/2021 05:08 PM, uhlat wrote:

Same problem with the 32QN600-B

Is there a way to extract the firmware image for analysis without resorting to physical means?

— You are receiving this because you were mentioned. Reply to this email directly, view it on GitHub https://github.com/rockowitz/ddcutil/issues/100#issuecomment-868834320, or unsubscribe https://github.com/notifications/unsubscribe-auth/ADMGY3XOLG3NZVC5R35CX73TUTV5RANCNFSM4J22O4BA.

amerrit2 commented 3 years ago

Using 27UD88-W , it switches from DVI to HDMI just fine, but can't switch back from HDMI to DVI. That's what others are experiencing right? That the INPUT_SOURCE code fails when the current source is HDMI?

I updated my monitor firmware to 3.21 but that didn't work.

@hartman If your older monitor doesn't have this same problem, do you think downgrading the firmware could fix it?

jonpas commented 3 years ago

That's what others are experiencing right? That the INPUT_SOURCE code fails when the current source is HDMI?

No, switching via DDC doesn't work at all, from any source.

yeahman45 commented 3 years ago

I have the similar behaviour on my lg29um68. Can switch from any source (displayport and hdmi2) to hdmi1 but cannot switch from hdmi1 to hdmi2 or displayport or from displayport to hdmi2 or from hdmi2 to displayport

On Mon, Jul 19, 2021, 8:14 PM Adam Merritt @.***> wrote:

Using 27UD88-W , it switches from DVI to HDMI just fine, but can't switch back from HDMI to DVI. That's what others are experiencing right? That the INPUT_SOURCE code fails when the current source is HDMI?

I updated my monitor firmware to 3.21 https://www.lg.com/us/support/software-firmware-drivers?customerModelCode=27UD88-W&csSalesCode=27UD88-W.AEU&category=CT10000030&subcategory=CT30000200 but that didn't work.

@hartman https://github.com/hartman If your older monitor doesn't have this same problem, do you think downgrading the firmware could fix it?

— You are receiving this because you commented. Reply to this email directly, view it on GitHub https://github.com/rockowitz/ddcutil/issues/100#issuecomment-882677265, or unsubscribe https://github.com/notifications/unsubscribe-auth/AEJTZP474SPVKC6CXLOYKFLTYRFOXANCNFSM4J22O4BA .

amerrit2 commented 3 years ago

I haven't tried the other HDMI port, but I doubt that'd work. Anyone out there with a workaround? Could the monitors be controlled over USB-C for example... ?

On Mon, Jul 19, 2021 at 1:23 PM yeahman45 @.***> wrote:

I have the similar behaviour on my lg29um68. Can switch from any source (displayport and hdmi2) to hdmi1 but cannot switch from hdmi1 to hdmi2 or displayport or from displayport to hdmi2 or from hdmi2 to displayport

On Mon, Jul 19, 2021, 8:14 PM Adam Merritt @.***> wrote:

Using 27UD88-W , it switches from DVI to HDMI just fine, but can't switch back from HDMI to DVI. That's what others are experiencing right? That the INPUT_SOURCE code fails when the current source is HDMI?

I updated my monitor firmware to 3.21 < https://www.lg.com/us/support/software-firmware-drivers?customerModelCode=27UD88-W&csSalesCode=27UD88-W.AEU&category=CT10000030&subcategory=CT30000200

but that didn't work.

@hartman https://github.com/hartman If your older monitor doesn't have this same problem, do you think downgrading the firmware could fix it?

— You are receiving this because you commented. Reply to this email directly, view it on GitHub <https://github.com/rockowitz/ddcutil/issues/100#issuecomment-882677265 , or unsubscribe < https://github.com/notifications/unsubscribe-auth/AEJTZP474SPVKC6CXLOYKFLTYRFOXANCNFSM4J22O4BA

.

— You are receiving this because you commented. Reply to this email directly, view it on GitHub https://github.com/rockowitz/ddcutil/issues/100#issuecomment-882724444, or unsubscribe https://github.com/notifications/unsubscribe-auth/ACP6YCJ46DUSWDUNWCJLQBDTYRNSPANCNFSM4J22O4BA .

amerrit2 commented 2 years ago

I'm purchasing an HDMI to USB-C adapter for $8 ... I hope that'll work

majodev commented 2 years ago

@amerrit2 I'm using a LG UltraFine 32UN880-B with a MacBook Pro + ddcutil. I can confirm that switching from USB-C does not work either (same as HDMI).

AM-PRO commented 2 years ago

I'm using a LG ultrawide 29UB67-B.

From windows I can switch : from dvi to hdmi 1 from hdmi 1 to dvi

From windows i cannot switch from or to displayport (it flashes my screen and come back to current input source)

I tried from Mac os with a m1 chip and I can switch from displayport and to displayport ... I have no idea why

Synvani commented 2 years ago

Can confirm "getvcp 60 always returns x00, which is not a valid value. setvcp 60 flashes the screen, never sets the value" is also happening on LG 29WN600-W (UltraWide 29"). What a shame :(

OnHisOwn commented 2 years ago

Potential 'fix' for those affected, on my new 27GP850

1) Enable auto-switch in monitor settings 2) In ClickMonitorDDC 7.2 use the 'turn off' command (not 'power off/on', this doesn't work) 3) If you activate something on the input you want to switch to (eg wiggle a mouse), the monitor will recycle to that input

Takes a few seconds longer than input switch command on CMM did with my old acer, but it's a workaround I'm willing to accept as I really didn't want to return an otherwise excellent monitor. Not sure how it would work with a non-interactive input. Hopefully helps somebody with a similar usage scenario to me :)

yeahman45 commented 2 years ago

Potential 'fix' for those affected, on my new 27GP850

  1. Enable auto-switch in monitor settings
  2. In ClickMonitorDDC 7.2 use the 'turn off' command (not 'power off/on', this doesn't work)
  3. If you activate something on the input you want to switch to (eg wiggle a mouse), the monitor will recycle to that input

Takes a few seconds longer than input switch command on CMM did with my old acer, but it's a workaround I'm willing to accept as I really didn't want to return an otherwise excellent monitor. Not sure how it would work with a non-interactive input. Hopefully helps somebody with a similar usage scenario to me :)

nice clever trick but my stupid LG 29UM68-P does not have auto switch... :(

AndyKassell commented 2 years ago

I can confirm the LG 27UL650 also has the input switch issue, I was replacing an older model which did work, I have emailed UK tech support to see what they say and will post any response, but have returned monitor and will look for a replacement.

reagentoo commented 2 years ago

32UL950-W having same issue - does not switch between inputs. (firmware was updated in aug. 2021)

# ddcutil detect | grep year
      Manufacture year:     2019,  Week: 9
# ddcutil -d 1 getvcp 60
VCP code 0x60 (Input Source                  ): DisplayPort-1 (sl=0x0f)
# ddcutil -d 1 setvcp 60 0x11
# ddcutil -d 1 getvcp 60
VCP code 0x60 (Input Source                  ): DisplayPort-1 (sl=0x0f)

LG 🖥 🗑

AndyKassell commented 2 years ago

Had a response from tech support and same as others in forum, they said

We have had a response from our Technical Team and they have advised that our monitors do not support DDC-CI officially. Some models are able to issue some commands such as brightness, contrast etc, but if there are issues with this, it would not be considered a fault as it is not guaranteed to work. I apologise for any frustration this causes.

Having already sent the monitor back I didn't take it further as it was in the manual but would not expect anything to be done. Have replaced with a BenQ model, which fully works with DDC-CI (and allows input to be changed from an input that is not currently selected which is great for my use case).

So it seems the newer model simply won't work with DDC-CI input switching as it is intended.

hiSK0R commented 2 years ago

can confirm this workaround works on LG ULTRAGEAR. I have found no other methods that work. I really loved this feature on my old samsung monitors - flip flopping between my docking station (work) an my gaming pc was so convenient with a keystroke both ways. AHK - ctrl+alt+[ & ctrl+alt+]

primesun commented 2 years ago

Potential 'fix' for those affected, on my new 27GP850

1. Enable auto-switch in monitor settings

2. In ClickMonitorDDC 7.2 use the 'turn off' command (not 'power off/on', this doesn't work)

3. If you activate something on the input you want to switch to (eg wiggle a mouse), the monitor will recycle to that input

Does anyone know what the ClickMonitorDDC 'turn off' command actually does? Which VCP code is it? It doesn't appear to be the same as VCP code D6 based on my testing with an Acer CB272U.

Ennazk commented 2 years ago

Confirming same issue here on LG49wl95c...

ronnix commented 1 year ago

Same issue with LG 34WK95U, cannot seem to switch input.

13 commented 1 year ago

Same issue with LG 34WN750. Never again LG.

mboleary commented 1 year ago

I'm seeing the same behavior with an LG 27UK580, and I will probably be returning it as a result of this and purchasing a non-LG monitor

bsny commented 1 year ago

also confirmed on LG 49WQ95C - trying to escalate with LG support now

baldurfour commented 1 year ago

Same issue 27GL850, it tries to change and then goes back...

btarb24 commented 1 year ago

In for updates.

Fails with LG 34" ultrawide 34GP83A-B. The monitor does not react to the x60 message whatsoever (no screen flashes). There's also no differences in x60 or any of the other vcp codes listed in ControlMyMonitor when observed from either workstation (one on DP and one on HDMI1)

Oddly, x60 lists four Possible values (15-18), however the hardware only has 3 ports (DP, hdmi(x2))

egormanga commented 1 year ago

@primesun Try xset dpms force standby, as it does the trick for me (with 32GN600).

ylaurent commented 1 year ago

What is doing that command ? I am on macOS so I tried my luck with kfix/ddcctl but inputs change doesnt seems to work either for my LG monitor (32UQ850-W). It seems that tools doesnt have that standby command @egormanga You workaround force the standby on the current used inputs, and then it auto switch to another one ?

aeleus commented 1 year ago

Add the 35BN75C-B to the list of LG monitors that cannot switch inputs using DDC.

When the input is set to DisplayPort, it will switch to HDMI, but then it's stuck. The monitor menu still shows the input set to DisplayPort. I have to use the hardware controls to set it back.

When the input is set to HDMI, any DDC software I try returns errors and nothing happens.

Other settings (brightness, volume, etc.) seem to work as expected.

shinyquagsire23 commented 1 year ago

Some notes, because I just got LG's funky 16:18 monitor which also has PBP:

Other stuff from reverse engineering their OSC software:

twig commented 1 year ago

Adding to the list, LG 29WK500 is also stubborn and wont switch inputs.

shinyquagsire23 commented 1 year ago

So, I've been reverse engineering the LG firmware (with a surprising amount of success given that MStar uses a proprietary ISA) and the only significant discovery I've made is that I can activate PBP mode using VCP 0xD7: 0x3 sets it to 2/3 on the left, 1/3 on the right, and 0x5 sets it to half and half.

The problem is that I have the 8:3 aspect ratio monitor and the vertical splits are kinda useless for me lmao, hopefully I can find the horizontal ones. But I guess if anyone has a ultrawide with PBP: there you go. Still can't find the input switcher either, it expects a value under 5 though.

shinyquagsire23 commented 1 year ago

ok actually I managed to find the input switching in a service manual of all things (filename 32BL95UW.pdf, search lg monitor service manual "DDC2AB"), but it's not via VCPs, it's via the service/factory/manufacturer sidechannel "DDC2AB" (0x50 instead of 0x51)

Over USB HID (VID 0x043E, PID 0x9a39): 08 02 55 04 26 00 0b 37 50 84 03 f4 00 90 dd

Over I2C: 50 84 03 f4 00 90 dd

So it's DDC2AB Command 0xF4, values 0x90 (HDMI1) 0xD0 (DP) 0xD2 (USB-C). It operates the same as the input switcher as well, so if you're in PBP and the secondary is HDMI1, it will swap the displays if you set the primary to HDMI1.

aeleus commented 1 year ago

ok actually I managed to find the input switching in a service manual of all things (filename 32BL95UW.pdf, search lg monitor service manual "DDC2AB"), but it's not via VCPs, it's via the service/factory/manufacturer sidechannel "DDC2AB" (0x50 instead of 0x51)

Over USB HID (VID 0x043E, PID 0x9a39): 08 02 55 04 26 00 0b 37 50 84 03 f4 00 90 dd

Over I2C: 50 84 03 f4 00 90 dd

So it's DDC2AB Command 0xF4, values 0x90 (HDMI1) 0xD0 (DP) 0xD2 (USB-C). It operates the same as the input switcher as well, so if you're in PBP and the secondary is HDMI1, it will swap the displays if you set the primary to HDMI1.

Very nice work @shinyquagsire23.

Any suggestions for those of us who need to switch inputs while using Windows? I don't see a way to do this using ControlMyMonitor or ClickMonitorDDC.

shinyquagsire23 commented 1 year ago

@aeleus not sure honestly, the easiest way would be via USB instead of i2c though, since i2c apparently has to go through GPU drivers which is its own mess. I've got a basic python script if anyone wants to try on Windows:

https://gist.github.com/shinyquagsire23/f6b2adef253c6c3ab557a4852bf3abad

drzony commented 1 year ago

@shinyquagsire23 I've tried your Python script on 38WN95C-W and unfortunately it does not work :( The data is sent to monitor, but nothing changes. Do you have any other ideas I can try?

TinkoLiu commented 1 year ago

Same issue on 27GP95R, and python script above not working.

shinyquagsire23 commented 1 year ago

@TinkoLiu @drzony I apparently had a bug which caused it to error before sending things, but also I went ahead and cleaned up the script for normal usage (it takes arguments now instead of just being hardcoded to switch to HDMI1 and no PBP, and it shows a help prompt)

drzony commented 1 year ago

@shinyquagsire23 I was already able to send data with the previous code (I modified it a bit before trying, so the bug didn't affect me). It seems that 38WN95C-W has a different firmware. I get zero response when sending commands. I also tried your new script and nothing works. Things that I have tried:

Eiher my monitor does not have this functionality or it requires a different "wrapper" for the command.

rockowitz commented 1 year ago

@shinyquagsire23 Kudos on an impressive bit of reverse engineering. When I have a bit of time I'll look into exposing lower level ddcutil services for DDC communication with an arbitrary I2C slave address.

For those unaware of it, page Reverse Engineering Proprietary DDC Extensions on the ddcutil web site outlines a relatively inexpensive (i.e. less than $100) setup for sniffing the I2c bus and watching how LG's Windows app communicates with the monitor.

TinkoLiu commented 1 year ago

Sadly the modified script still don't work on 27GP95R. I can confirm that the packets was written, already captured by bus hound. But my monitor has no response to that.

drzony commented 1 year ago

@rockowitz The problem with my monitor is that the LG Windows app does not support input switching, so I have nothing to sniff. I was hoping that the reverse engineered HID communication would work.

TinkoLiu commented 1 year ago

I just tried some decompile research on OnScreen Control and searching if there were hidden input switch function. Bad news, nothing found. Another bad news, this is how LG engineers write the code.

image

btarb24 commented 1 year ago

omg... it's a ternary explosion!!

shinyquagsire23 commented 1 year ago

@TinkoLiu for the 27GP950 firmware (I assume it's similar to the 27GP95R, but 27GP95R has no fw updates so idk), they seem to have inexplicably feature flagged it to 3 older monitors, whereas on the DualUp (28MQ780) it's feature flagged using a bitmap (again, why they need a per-model feature flag is beyond me lol)

DualUp firmware code

Screenshot 2023-02-24 at 12 39 28 PM

27GP95R

Screenshot 2023-02-24 at 12 33 32 PM

For the curious, the list of 'supported' monitors for input switching is supposed to be: GP850, QP750, GP950, WP950C, QP88D, UL550/500, GP750, 28MQ780, UP850, GP950, UN880, GQ850, UQ85R, WQ75C, WQ60C, WQ95C, UP600, UQ85R again

Explicitly unsupported monitors (lol?): GP850, UQ750, GQ900

Might see if I can make a tool that pulls the firmware bc I have a way to fix it, technically, but it relies on memory reads/writes and without the firmware I can't know the addresses to patch. That's what I've been doing w/ https://github.com/shinyquagsire23/lg_display_manager to fix the PBP/PIP switching.

kingreboot commented 1 year ago

Adding 32UN650-W having same issue

jman83 commented 1 year ago

Following this thread. Recently got a 49WQ95C-W and for my use case, I want to have the ability to enable/disable PBP using software rather than the button behind the monitor

jman83 commented 1 year ago

@shinyquagsire23 is there any possibility of "adapting" your lg display monitor utility for the 49WQ95C-W running on windows?

rockowitz commented 1 year ago

The current 1.5.0-dev branch has a hack that allow you to set set an arbitrary source address field in the DDC/CI Set Feature Request packet. It is controlled by temporary option name --i1, which takes an integer argument. (The parser recognizes several temporary use options named --f1, --s1, --i1 etc. to simplify testing without having to modify the parser.)

Here's an example of its use:

$ ddcutil setvcp xf4 x0090   --i1 x50  --noverify --trcfile i2c_execute

The final lines show the output show the ioctl() write for the Set Vcp Feature request packet, which has the non-standard source address, and is the same packet as documented by @shinyquagsire23.

...
1217380](i2c_ioctl_writer              ) Starting  fh=3, filename=/dev/i2c-5, slave_address=0x37, bytect=7, pbytes=0x557ef2cefe71 -> 50 84 03 f4 00 90 dd
   i2c_rdwr_ioctl_data at: 0x7ffeae527e90
      nmsgs:    1
      i2c_msg[0]
         addr:     0x0037
         flags:    0x0000
         len:     0x0007 (7)
         buf:     0x557ef2cefe71 ->  50 84 03 f4 00 90 dd
[1217380](i2c_ioctl_writer              ) Done      Returning: OK(0). 
[1217380](main                          ) ddcutil execution complete, Sat Feb 25 13:51:38 2023

This is the same packet documented by @shinyquagsire23.

(Note that --i1 argument needs to specified as a hex number. Otherwise it will be interpreted as an integer. The --noverify option was specified because a normal getvcp request would of course fail.)

theli-ua commented 1 year ago

I just tried some decompile research on OnScreen Control and searching if there were hidden input switch function. Bad news, nothing found.

Its kinda there (not really). In the libraries there is a code to "SetInputSource" in LGMonitorDDCCISDK.dll that is installed in windows directory, this calls SetProperty(0x60, value) in LGProtocolEngine.dll that is also there. All that code does is just standard setvcp 0x60. which obviously doesn't work. Given that OSC doesn't have ability to switch inputs thats probably just some of their standard ddc sdk stuff that is not used by osc

Santaliii commented 1 year ago

LG 24GN600 here, also doesn't respond to Input Select.