19-07-2019 11:51 AM in
AccessoriesI have connected my Galaxy S8 + DeX Station to my TV and the picture quality isn't very good.
My TV can display 1080p fine, and there are no problems with any other devices any more: the symptoms are the same as what I had with my old MacBook Pro. The solution was a straightforward fix, forcing it to send RGB output over HDMI instead of YCbCr (https://spin.atomicobject.com/2018/08/24/macbook-pro-external-monitor-display-problem/) , and doing this made the picture quality perfect.
Is this something that could be added, or maybe just prioritise RGB if it's available?
01-12-2022
10:18 AM
- last edited
01-12-2022
12:45 PM
by
AshP_
) in
There are some monitors, in my case S8/DeX , that report having YCbCr support when plugged in over HDMI. My AMD Radeon RX 570 Series video card sees this YCbCr pixel format and then prefers that over the RGB pixel format. The result is that fonts, graphics and other visuals are pixelated and not smooth in Ubuntu.
This actually is not just a Linux problem. A similar problem exists on macOS with the same monitor hooked up over HDMI. Basically I have faced this while developing an app, then I have needed another screen for output check. In fact an article by John Ruble on the Atomic Object blog called Fixing the External Monitor Color Problem with My 2018 MacBook Pro attempts to fix the exact same thing.
All of the articles I could find exploring this topic advocate patching the EDID for the monitor. Unfortunately the macOS solution would not work here. Luckily I found a Reddit post that covered how to get it working.
Install the patched EDID (this example uses the pre-patched EDID attached here) and modify GRUB to use the new EDID.
$ sudo mkdir -p /lib/firmware/edid
$ cd /lib/firmware/edid
$ wget https://gist.github.com/RLovelett/171c374be1ad4f14eb22fe4e271b7eeb/raw/edid.bin
$ sudo tee "/etc/initramfs-tools/hooks/edid" > /dev/null <<'EOF'
#!/bin/sh
PREREQ=""
prereqs()
{
echo "$PREREQ"
}
case $1 in
prereqs)
prereqs
exit 0
;;
esac
. /usr/share/initramfs-tools/hook-functions
# Begin real processing below this line
mkdir -p "${DESTDIR}/lib/firmware/edid"
cp -a /lib/firmware/edid/edid.bin "${DESTDIR}/lib/firmware/edid/edid.bin"
exit 0
EOF
$ chmod +x /etc/initramfs-tools/hooks/edid
$ sudo update-initramfs -u
Edit /etc/default/grub and add drm_kms_helper.edid_firmware=edid/edid.bin to the end of GRUB_CMDLINE_LINUX_DEFAULT.
For example:
--- /etc/default/grub 2020-03-19 15:27:24.350222700 -0400
+++ /etc/default/grub 2020-03-19 14:22:58.052179120 -0400
@@ -7,7 +7,7 @@
GRUB_TIMEOUT_STYLE=hidden
GRUB_TIMEOUT=0
GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`
-GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
+GRUB_CMDLINE_LINUX_DEFAULT="quiet splash drm_kms_helper.edid_firmware=edid/edid.bin"
GRUB_CMDLINE_LINUX=""
# Uncomment to enable BadRAM filtering, modify to suit your needs
After saving the changes to /etc/default/grub run sudo grub-mkconfig -o /boot/grub/grub.cfg and reboot.
Find your current EDID and copy it to the current working directory.
$ sudo find /sys/devices/pci*/*/*/*/*/*HDMI* -name "*edid*" | head -1 | xargs -I{} cp {} edid.bin
$ sudo apt install -y libwxgtk3.0-dev
$ wget https://sourceforge.net/projects/wxedid/files/wxedid-0.0.19.tar.gz/download
$ tar xvf wxedid-0.0.19.tar.gz
$ cd wxedid-0.0.19
$ ./configure --prefix=$HOME
$ make
$ make install
$HOME/bin/wxEDID
Hope this will help everyone.