goodtft / LCD-show

2.4" 2.8"3.2" 3.5" 5.0" 7.0" TFT LCD driver for the Raspberry PI 3B+/A/A+/B/B+/PI2/ PI3/ZERO/ZERO W

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

4.0" HDMI Display (MPI4008) on CM4 with Raspberry Pi OS Bookworm

vitorio opened this issue · comments

I've gotten the 4.0" HDMI Display (MPI4008) working on a CM4 with Raspberry Pi OS Bookworm over HDMI.

Get a copy of the display's EDID. You can use a tool like Monitor Asset Manager under Windows, or download a copy from https://edid.tv/edid/1665/ (both were identical for me). Create the /usr/lib/firmware/edid directory on your Bookworm installation if it doesn't already exist, then copy the EDID into it. Append the kernel commandline to load the EDID and set the video mode appropriately.

After a reboot, the display flickers several times, but eventually displays the end of the startup scroll and the login prompt. (I do not see the four raspberries and the start of the scroll.) No other changes were necessary to get framebuffer output at the console.

$ wget -O MPI4008_1.edid https://edid.tv/edid/1665/download/
$ sudo mkdir /usr/lib/firmware/edid
$ sudo mv MPI4008_1.edid /usr/lib/firmware/edid/
$ sudo nano /boot/firmware/cmdline.txt
  drm.edid_firmware=edid/MPI4008_1.edid video=HDMI-A-1:480x800@62
$ sudo reboot

Depending on your use case, rotation can be done with panel_orientation, e.g. video=HDMI-A-1:480x800@62,panel_orientation=left_side_up; or rotate, e.g. video=HDMI-A-1:480x800@62,rotate=90 (see https://www.kernel.org/doc/html/latest/fb/modedb.html for options).

Does this solve touchscreen issue?

I'm not using the touchscreen or a graphical desktop in my CM4 application, but I plugged it into a Raspberry Pi 400 running Bookworm with Wayland (not X11) to see.

By default, the display came up over HDMI, with the Wayland desktop, without me needing to set up the EDID as described above. It defaulted to portrait mode (HDMI port on the left as you look at the screen), and the "Screen Configuration" app did rotate the screen properly.

When I enabled SPI and added the touchscreen dtoverlay from MPI4008-show to /boot/config.txt, the touchscreen also worked as expected in the default portrait orientation. In other orientations, it behaved incorrectly; the X and Y axes appeared swapped and/or one of the axes was inverted.

$ sudo nano /boot/config.txt
  dtparam=spi=on
  dtoverlay=ads7846,cs=1,penirq=25,penirq_pull=2,speed=50000,keep_vref_on=0,swapxy=0,pmax=255,xohms=150,xmin=200,xmax=3900,ymin=200,ymax=3900

While the dtoverlay allows for swapping the axes, it doesn't allow for inverting them, so if you're not running the screen in its default portrait orientation and need the touchscreen, perhaps it's better to leave the dtoverlay as-is and do everything with calibration.

For a rotated screen with correct touchscreen, create a new udev rule file for the touchscreen, set the libinput calibration matrix to correct the issues, and reboot (the Raspberry Pi Wayfire compositor doesn't appear to apply the changes live even when udevadm is reloaded and triggered).

$ sudo nano /etc/udev/rules.d/99-mpi4008-ads7846.rules
  SUBSYSTEM=="input", KERNEL=="event[0-9]*", ATTRS{name}=="ADS7846 Touchscreen", ENV{LIBINPUT_CALIBRATION_MATRIX}="0 1 0 -1 0 1"

For a "right" rotation according to Screen Configuration (HDMI port on the bottom as you look at the screen), this matrix worked: 0 1 0 -1 0 1 (this is the example above)

For a "left" rotation (HDMI port on the top): 0 -1 1 1 0 0

For an "inverted" rotation (HDMI port on the right): -1 0 1 0 -1 1

This is incredibly interesting, thank you for taking the time to do this research. I am working on a few projects currently but I am very interested in trying your solution in the future.

This worked perfectly!