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