UP-board, Adding a display without a EDID to a Linux device

How to setup a display without EDID

Waveshare 5 inch B is a nice display for an embedded target. It looks similar to an Adafruit HDMI 5″ 800×480 Display Backpack – With Resistive Touchscreen. This screen on the other hand uses an EDID, so it can be hooked up to any HDMI port and should be recognized automatically. This is not the case for the Waveshare. They do however share some similarities.
They both utilize the TFP401 decoder chip of TI. The touch controller is different however.
The TFP401 is hidden underneath the screen:

How to debug

I wasn’t sure it didn’t utilize an EDID so with the use of get-edid on linux (read-edid package)
I could confirm no EDID was present. I’ve also sanity checked this with i2c tools because HDMI utilises DDC which is similar to i2c.
After digging through the kernel log with dmesg I figured out that the drm driver was complaint that no EDID was present so it configured the l915 fb driver to 1024×768 by default.

 

As the datasheet describes the TPF401 should receive a 800×480 60Hz signal otherwise it will not work. To configure Linux to bootup with a fixed resolution you can simply add the following line to your kernel bootparam:

 

These bootargs can be found here.

<xres>x<yres>[M][R][-<bpp>][@<refresh>][i][m][eDd]
   <name>[-<bpp>][@<refresh>]

The display configuration set could be found on the waveshare website

800 480 60 6 0 0 0

From the Raspberry Pi hdmi_cvt driver page I could figure out what these values mean:

hdmi_cvt=<width> <height> <framerate> <aspect> <margins> <interlace> <rb>

 

These values can be used to configure the video kernel bootparam.

800x480 Resolution from rpi config

- Seperator

24 24 bits per pixel  (source unknown)

@60 60Hz from rpi config

D Enable HDMI output

I did however find a 24 BPS requirement for this display but was unable to find the source, I stuck with it and it works.

One of the toughest parts of configuring this was the name, xrandr a nice tool to configure your HDMI with  called the HDMI port HDMI-1. After configuring HDMI-1 the kernel kept crashing due to a null pointer. When I looked the HDMI up in /sys/class/drm I noticed it was called HDMI-A-1. After configuring HDMI-A-1 it worked.

HDMI-A-1 /sys/class/drm/card0-HDMI-A-1

How to setup X11 to automatically bootup in the correct resolution
The system booted with a 1024*768 X11 resolution. This was a bit annoying because our screen doesn’t scale. So it showed just 800*480, this could easly be fixed with the command:

To get this configured on statup, it should be configured in an X11 config.

/etc/X11/xorg.conf
Section "Device"
	Identifier "Card0" 
EndSection
Section "Monitor"
	Identifier "Monitor0" 
EndSection 
Section "Screen"
	Identifier "Screen0"
	Monitor "Monitor0"
	Device "Card0" 
	SubSection "Display" 
	Depth 24
	Modes "800x480"
	EndSubSection
EndSection

Setup kernel bootargs for the UP board

The UP board utilizes GRUB. Not like many other embedded Linux boards who use U-Boot.
But the idea is the same. Configure your kernel command line with the correct bootparams.

For grub:

Edit the GRUB_CMDLINE_LINUX_DEFAULT, add the video bootparam.

/etc/default/grub GRUB_CMDLINE_LINUX_DEFAULT=” quiet splash video=HDMI-A-1:800x480-24@60D”

sudo update-grub

sudo reboot

cat /proc/cmdline

Some systems also log the kernel command line in the kernel log: dmesg