Jump to content

Fixing no brightness control on a thinkpad after replacing the screen

TL;DR; I replaced the screen on my T450, but the brightness control was not working on Windows. I fixed the problem with fairly simple hack on the LCD panel.

 

Hello everyone. I had replaced the screen on my Thinkpad T450 from an 1366x768 TFT panel to an 1920x1080 IPS panel (model LP140WF3-SPC1). At first all seams to work, but when i got into windows the brightness control has not working. 

After a lot of trouble shooting, research and some frustration later i managed to find why and how to fix the issue. And i figure i would be a good idea to document what i did just in case someone wants to do the same upgrade.

 

First of all what is the problem?

In short terms every modern display device was a thing called EDID (Extended Display Identification Data) that was a identification and timing information for the display. On the Thinkpad's BIOS that is a list of accepted EDIDs (that just happen to be the first party ones), if your display was an EDID that is not on the list, the video drivers on Windows will not allow you to control the display brightness (it works on Linux just fine by the way).

 

How to fix this?

Well, you can either get a first party replacement LCD or you can hack yours so the EDID on it is one of the ones white listed on the BIOS, and i choose the latter.

 

What you need?

first of all you need at least one of the white listed EDIDs on the bios (you can dump the one from your old display if you are just replacing a damaged screen).

I attached the full lists for the T450/T450s and the T550/W55s that i found in the notebookreview forum by user T456

second your LCD needs to allow overwriting the EDID (unfortunately i can't help with finding out about that) and it's timings must be the same as one of accepted LCDs (read this as being "compatible replacement part")

You will also need either a linux install or a live boot drive to it (preferably use Ubuntu or Mint), and a program that can allow you to read the EDID files (i used the program AWE EDID Editor) so you can pick each one you will use.

 

What is the procedure?

1) get the EDID data from the new panel. 

  • Boot into Linux, open the terminal and install the "get-edid" package
  • Run the command "sudo get-edid > file_name.bin" (make sure you have no external displays attached)
  • pay attention to the BUS number that the get-edid command says your monitor is in (this will be used later, in my case was BUS 4)

451511821_get-editoutput.png.2212efd67cf9ef71654555a86416b80f.png

 

2) use the tool of your choice to compare the new LCD EDID with the ones that are white listed, try to find one that is the best match to the original. In my case the one i pick was identical except the white listed one had an extra copy on the timings

This is for the white listed EDID (from an LP140WF3-SPD1)

1225248751_Annotation2019-12-28142712.png.0ec68838bb51f6c38699c495aa89b16f.png701227957_Annotation2019-12-28142754.png.faaf2fbf542d738f65e6b44e885aca6e.png

 

And this is from EDID extracted from my LCD (LP140WF3-SPC1)

2703438_Annotation2019-12-28142829.png.b6e23c810285e46ee710779256a32e46.png337579856_Annotation2019-12-28142859.png.9edbaa62ef0094653b380e94452aca26.png

 

As you can probable see, the two panels are pretty much the same thing since they are interchangeable replacement parts from one another

 

3) Now you need to convert the RAW EDID data into ASCII text (also know as type it manually in a text file). You need to type the first 128 bits of data to a text file separating the bytes with spaces or line breaks 

image.png.15eed44dc92ac1abf590fed0d2a1e419.png

 

4) Now is time to flash the EDID data into the display

  • Boot into Linux, open the terminal and make sure the package "i2c-tools" is installed (test it by typing the command "i2cdetect -l")
  • run the command "git clone http://github.com/tomka/write-edid" (or download the flies manually)
  • go to the folder where the files where downloaded (aka "cd write-edid" if you used the git clone command)
  • copy the text file with the EDID data to folder you are in now (the folder with the script we just downloaded)

and we got to the dangerous part, so make sure the text file is all correct (and using linux line endings just for safety) because if you flash it wrong in the best case scenario you will have to flash the original EDID data and in the worse you will fry your LCD.

  • now run the command "sudo ./write-edid.sh bus_number data_file_name", where the bus_number is the number we got on step 1 and data_file_name is the name of the text file with the EDID data you created. in my case the bus number was 4 and the file was edid.txt so it would be "sudo ./write-edid.sh 4 edid.txt"

5) With that done just make sure of restart windows (literally it will not work until you make a full restart), and it should be working, well at least it worked for me.

 

And that all for this whatever this is. And if you read until here, i'm fully aware how much my writing sucks so, thank for your effort.

I really hope this can eventually help someone.

 

ThinkPad T550 and W550s - white-list edids (bios v1.09 and v1.10).7z ThinkPad T450 and T450s - white-list edids (bios v1.09).7z

Link to comment
Share on other sites

Link to post
Share on other sites

  • 4 months later...

Hey Leon,

 

thanks for perfect manual how to change EDID information after display replacement on thinkpad laptop.

 

I have a few questions:

When trying to read i2c interface and see used buses, I have no output for this, please see following:

This is what I got when I process it:
sudo get-edid > /tmp/edid
[sudo] password for ricaard:
This is read-edid version 3.0.2. Prepare for some fun.
Attempting to use i2c interface
Looks like no busses have an EDID. Sorry!
Attempting to use the classical VBE interface

        Performing real mode VBE call
        Interrupt 0x10 ax=0x4f00 bx=0x0 cx=0x0
        Function supported
        Call successful

        VBE version 300
        VBE string at 0x11100 "Intel(R) HSW Mobile/Desktop Graphics Chipset Accelerated VGA BIOS"

VBE/DDC service about to be called
        Report DDC capabilities

        Performing real mode VBE call
        Interrupt 0x10 ax=0x4f15 bx=0x0 cx=0x0
        Function supported
        Call successful

        Monitor and video card combination does not support DDC1 transfers
        Monitor and video card combination supports DDC2 transfers
        0 seconds per 128 byte EDID block transfer
        Screen is not blanked during DDC transfer

Reading next EDID block

VBE/DDC service about to be called
        Read EDID

        Performing real mode VBE call
        Interrupt 0x10 ax=0x4f15 bx=0x1 cx=0x0
        Function supported
        Call failed

The EDID data should not be trusted as the VBE call failed
Looks like VBE was successful. Have a good day.
 
Also, when I use i2cdetect -l command, there is absolutely no output for it. Are you asking on which dist I did this? Manjaro, so Arch based.
 
Next, I can export this data from /sys folder, but as I said, there is no "BUS" information of used interface for display.
Also, comparing my values of FHD display comparing with whitelisted you shared with us, there is no display which I could compare with...Therefore I dont know what could happen if I overwrite EDID information with "wrong" display.
Also, when no BUS is found, script from GIT is basically not usable, again, no BUS found.
 
Thanks for any tips here...
Cheers
Link to comment
Share on other sites

Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×