Fixing a purple backlight on an HP DreamColor LP2480zx

The HP DreamColor LP2480zx is a top-of-the-line color-critical monitor that retailed for $3500 and features some really impressive specs, such as a true 10-bit IPS panel, hardware-based calibration, and an RGB LED backlight. Unfortunately, these monitors eventually develop a purple/magenta color cast over the entire screen and calibrating with HP's proprietary solution does not fix the problem. I got my hands on one of these monitors on eBay for around $100 (so around 3% of the retail price) due to the aforementioned purple-tint issue and set out to fix it. Here is my journey.


The tech

The first question on many people's minds is "why bother?" Aside from the enjoyment of solving problems and tinkering with electronics, this monitor boasts some seriously impressive specs even by today's standards, despite being released way back in 2008. The monitor was developed by HP in collaboration with DreamWorks Animation (hence the name) and was used for color-critical work. Here are some of the goodies:

  • True 10-bit IPS panel which allows for not 50, not 256, but a whopping 1024 shades of gray and a total of over 1.07 billion colors. The modern-day DreamColor monitors are inferior since they use 8-bit panels with dithering (AFRC).
  • RGB LED backlight which allows for adjustments to the white balance of the display without any loss of color resolution and compensation for wear over time (at least in theory... more on this below).
  • Extremely wide color gamut which exceeds "wide gamut" Adobe RGB and nearly meets the Digital Cinema P3 gamut. This monitor will display colors that most monitors simply can't.
  • "DreamColor Engine" which performs hardware-based calibration of the monitor. This is accomplished via matrix multiplier which allows for some rather sophisticated color transformations. Color space presets can be quickly selected via the press of a button and are meant to be programmed in via a proprietary calibration probe and software, ensuring accurate colors throughout the life of the monitor.
  • A-TW polarizer which greatly reduces "IPS glow", where colors appear washed out when viewed off-angle. You can clearly see the difference between a monitor with and without it in the picture at the top of this page.

The problem

The monitor uses an LG LM240WU5-SLA1 panel with an RGB backlight. Since LEDs can age at different rates (which causes colors to drift over time), LG thoughtfully included a color sensor and a color processing chip (Avago HDJD-J822) to maintain uniformity of colors. This allows the rest of the monitor's electronics to not worry about backlight drift – in fact, the backlight module accepts absolute Yxy coordinates instead of RGB for colors, which HP's circuitry uses to set brightness and white balance.

Unfortunately, the sensor in these panels goes bad within a few years. The failed sensor measures excessive amounts of green and compensates by turning down the green LEDs. Since there is no way to set individual RGB values for the backlight using the panel's interface, HP's circuitry is unable to compensate for this. The best it can do is utilize the DreamColor engine to calibrate the LCD panel, but after a certain point, there simply isn't enough green light for it to meet the characteristics of the desired color space and calibration fails. The purple color is seen at all times, including the "Scanning inputs" message that displays as soon as the monitor is powered on.


The whole scenario reminds me of a Douglas Adams quote.

The major difference between a thing that might go wrong and a thing that cannot possibly go wrong is that when a thing that cannot possibly go wrong goes wrong it usually turns out to be impossible to get at or repair.

There is no way for monitors using this panel to adjust individual R/G/B values of the backlight, whether via proprietary calibration solution like the DreamColor or manual adjustment like most other monitors, because the panel simply does not provide the appropriate commands to do so. (Even LG's own W2420R has an RGB adjustment limited to requesting Yxy coordinates, which would be inaccurate due to the failed sensor.) The sensor that was intended to maintain the backlight's color uniformity over time ended up making the problem far worse.

Exploring the color management system

I read through the datasheet of the Avago color chip and determined that it used the sensor's inputs to drive PWM outputs to control the actual backlight. The system normally operates in a "closed loop" mode where requests for a particular color are modified based on what the sensor is reading. At the factory, the system is put into "open loop" mode and an external colorimeter is used to measure actual values; this data is stored in the chip and is used for calculations during normal use.

After disassembling the monitor, the first step was to unplug the sensor from the LED driver board. I didn't have very high hopes but I powered on the monitor. For the first time, I saw a pure white background in the "check video cable" message, instead of a purple-tinted one. Success! Unfortunately this was short-lived, since any attempts at adjusting the monitor's settings (or even leaving it alone for a bit) resulted in each backlight color fading to a single channel within a few minutes. Only a complete power-down of the monitor would bring back the brief white backlight.

One possible solution would be to modify the factory calibration data on the chip. Unfortunately this would be a short-term solution since the color sensor would continue to wear out (and this wouldn't work if the sensor aged too far). I also lack the equipment and skills to remove and reinstall a surface-mounted chip in order to send it the necessary I2C commands, and the datasheet isn't clear on how to format the data.

Another possible solution would be to use a variable resistor to compensate for the sensor's output. I did not have success with this (splicing the resistor into the green channel). Due to the system operating in a closed loop, having the resistor even slightly off would result in similarly invalid results.

I eventually took the whole panel apart and removed the sensor itself. It was labeled "SD-9 94V-D" on one side and "0831" on the other. Unfortunately I could not find any data online about it, so replacing the sensor itself was out of the question. (And even if I could, it would likely have required factory calibration.)


Directly controlling the backlight with an Arduino

At this point I realized that the only feasible option was to directly control the backlight via PWM, bypassing the Avago color chip entirely. I had an Arduino at my disposal (which allows for several channels of PWM). Lacking any real tools for surface-mount work, I used an Xacto knife and needle-nose pliers to break the PWM output pins off of the chip, and then (after much trial and error) managed to solder 3 wires to the pads underneath it. This was the point of no return.


I wrote up a quick sketch to cycle an RGB LED through the full color spectrum and uploaded it to my Arduino. Then I plugged the Arduino into the monitor's USB hub, attached the wires, and turned it on. I was not expecting much, but to my surprise, the monitor powered up successfully and the "Check signal cable" message displayed with a fading rainbow of colors!


The same thing from another angle:


Backlight control software

In order to control the backlight, I created a simple Arduino sketch to hold the 3 PWM pins at a specific value, then listen over serial for new values. I also created a front end application to allow easy control from Windows. To keep things simple, I hard-coded default values (which are applied every time the monitor is powered on) but I could improve the functionality by allowing the Arduino to save those settings.


Finalizing the build

The Arduino fit nicely into an empty space near the cooling fan, although the USB plug was a bit too long. I held it in place with tape.


I ran the USB cable through a small hole I made in the outer casing of the monitor and plugged it into the hub on the side. This provides the Arduino with power and allows the computer to communicate with the Arduino through the uplink port.



Monitor controls

Since the color chip has been bypassed, the monitor's brightness and white balance controls are no longer functional. The only way to adjust brightness is through the app. The 3D LUT and matrix multiplier are still functional, however, so it should be possible to calibrate the monitor in hardware and use the color profiles. I'm not sure if the official HP Advanced Profiling Solution will still work as I do not own one.

PWM frequency

The Arduino is unable to output a high enough PWM frequency. Thus, the backlight flickers very noticeably unless it's near maximum. Near the lower end of the range, it looks like a strobe light. This is the biggest downside of my solution at this point; perhaps I can find a better microcontroller with a higher PWM frequency.

USB cable

Since the Arduino is powered via USB, and the backlight is now entirely dependent on the Arduino's PWM signal, the USB cable must be connected at all times. This uses up one of the four USB ports on the monitor.


Here is a demonstration of the final product.


If you'd like to attempt the mod yourself or look at my code, you may download it here.

I welcome any suggestions for improvement.

Posted on Sunday, December 18, 2016 at 3:05 AM | Permalink

Comments (12)

Monday, March 13, 2017 at 1:48 PM

I have the same issue my LP2480zx. Congratulations for your work.
I want to try your solution.

I'm not samiliar with Arduino but I can solder pretty well, even on those tiny chips.
Could you do a step by step tutorial to perform this repair procedure ?
In particular, identify the points to solder to the Arduino Board.

Options: Reply | Quote | Flag / Report

Monday, March 13, 2017 at 9:25 PM
@Unic I used the HDJD-SCR00 datasheet to determine which pins were the PWM outputs (pins 14 through 16, see page 3). I used wire from a floppy drive ribbon cable with some solid wires soldered to the other ends.

For the Arduino, you don't have to solder anything. Insert the solid wires into the Arduino's output pins 9 (red), 10 (green), and 11 (blue), then upload the sketch linked at the bottom of this page and run the included control software.
Options: Reply | Quote | Flag / Report

Tuesday, March 14, 2017 at 1:57 AM
Hi nookkin,

Thank you.

Indeed, with the datasheet that is more clear to me.

pin #14 (PWN_B) to arduino output pin #11 (blue)
pin #15 (PWN_G) to arduino output pin #10 (green)
pin #16 (PWN_R) to arduino output pin #9 (red)

To be clear, I have to cut the pins 14, 15 and 16 of the chip and after solder theses three wires to the board underneath.

Is any Arduino board compatible with your code or do I have to purchase a specific one ? Even the cheapest ? :D

Thanks again.
Options: Reply | Quote | Flag / Report

Wednesday, March 15, 2017 at 8:06 PM
@Unic Correct, you want your wires to connect to the board (and not the chip). Be sure to insulate the wires from the chip so they don't contact the Arduino circuit.

Any Arduino board marketed as an "Uno" should work (whether genuine or knockoff).
Options: Reply | Quote | Flag / Report

Thursday, March 16, 2017 at 2:15 AM
Hi Nookkin,

I ordered an "UNO R3 ATmega328P Development Board With Boot Loader For Arduino UNO F7" for 3$.

I hope it will do the trick and I'll keep you update on my repair. :D

Thanks again.
Options: Reply | Quote | Flag / Report

Sunday, April 9, 2017 at 3:24 AM
Hi Nookkin,

Wiring job done.

I messed up de-soldering one leg of the chip (one pad broke), so I choose to solder the wires on the smd resistors.

Some pictures of my intervention.

After taking this photographies, when bending the wire, one of of theses smd resistor unsticked of the board. The one corresponding to the pin #14 (PWN_B). No luck again.

So I decided to solder the blue wire to the pcb board point near marked as "PWNB". I placed a 1k resistor to this point (replacing like this the smd untiscked) and soldering the wire to this resistor. And it worked fine !

I think this could done to all. Solder a 1k resistor on each PCB points marked as "PWNR" ,"PWNG", "PWNB", and wire to the arduino board from theses resistors. It's an easier and safer way because the solder point are much bigger. ;)

The HP DreamColor LP2480zx colours are now fine. Thanks.

I was not able to use your program "Arduino Dreamcolor.exe". When I launch it. Windows tells me that is not a valid application. I surely miss a step.
Do I have to install another program before launching it ?

Thanks for your work, your dedication and your help, Nookkin. ;)


Options: Reply | Quote | Flag / Report

Wednesday, April 12, 2017 at 9:51 PM
The sensor appears to be as follows:

RGB Color Sensor
Options: Reply | Quote | Flag / Report

Sunday, April 16, 2017 at 3:26 PM
@Unic Make sure you have the .NET Framework 4 installed. Which version of Windows are you using?
Options: Reply | Quote | Flag / Report

Tuesday, April 18, 2017 at 5:10 AM
Hi i find datashit of sensor
Options: Reply | Quote | Flag / Report

Saturday, April 22, 2017 at 9:44 AM
Hi Nookin,

I running on Windows XP 32 bits and I have .Net Framework 4 Extended installed.

Options: Reply | Quote | Flag / Report

Saturday, April 22, 2017 at 2:33 PM
@Unic Did you try building it? I didn't actually intend to release the binary but it looks like there is one in the "obj" folder. It's possible that the binary is built for 64-bit Windows only (since it's not an actual released exe). I can build you a 32-bit one if you can't get the source code to build on your own.
Options: Reply | Quote | Flag / Report

Saturday, April 22, 2017 at 3:22 PM
Hi Nookkin,

Sorry, but I do not know how to build a 32 bits release. :/
What software do I have to use ?

Options: Reply | Quote | Flag / Report

Leave a comment

one times one is (Huh?)
Comment moderation is enabled.
Your comment will appear on the page after it has been reviewed.