After Jetson TX2 with L4T R28.1 bootup, X11 has Full (0-255 channel value) Color Range. 1
However, if X11 is closed (sudo service lightdm stop
) or switched to a Virtual Terminal (via CTRL+ATL+F1 or sudo chvt 1
), then Limited (16-254 channel value, washed out colors, low-contract image) Color Range is used.
This behavior is tested on different monitors (one with HDMI-IN, and two with DVI-IN).
After a lot of digging I’ve found undocumented Tegra-specific FB_VMODE_LIMITED_RANGE
bitflag of fb_var_screeninfo.vmode
than is responsible for selecting Color Range.
To get the value Color Range, run cat /sys/kernel/debug/tegradc.0/mode | grep vmode
.
To set the value of Color Range, compile and run:
#include </usr/src/linux-headers-4.4.38-tegra/include/uapi/linux/fb.h>
int main() {
fb_var_screeninfo vinfo;
assert(!ioctl(f, FBIOGET_VSCREENINFO, &vinfo));
v.vmode &= ~FB_VMODE_LIMITED_RANGE; // Sets Full Color Range.
//v.vmode |= FB_VMODE_LIMITED_RANGE; // Sets limited Color Range.
assert(!ioctl(f, FBIOPUT_VSCREENINFO, &vinfo));
return 0;
}
Further notes:
-
/usr/include/linux/fb.h
of both Vanilla Linux and L4T R28.1 does not have bitflagFB_VMODE_LIMITED_RANGE
defined. - Setting Color Range to Full only persists when in Graphics Mode of Virtual Terminal (
assert(!ioctl(f, KDSETMODE, KD_GRAPHICS))
). - Setting Color Range to Full returns back to Limited in a couple of seconds when in Text Mode of Virtual Terminal (
assert(!ioctl(f, KDSETMODE, KD_TEXT))
). - FB_VMODE_LIMITED_RANGE affects DRM Example (
tegra_multimedia_api.orig/samples/08_video_dec_drm/video_decode_drm
) the same way is affects Linux Framebuffer.
-What is the proper way to set Full Color Range in non-X11 environment?
- Does Limited Color Range is selected because of the monitor (video-in) properties?
- If yes, which ones?
- If no, does HDMI-OUT always have Limited Color Range by default?