cancel
Showing results for 
Search instead for 
Did you mean: 

Cannot drive a HDMI 800x480 display because of EDID block being all 0

aditya_m
Visitor

I am trying to drive a 5 inch 800x480 touch display from waveshare using my STM32MP257F-DK development board. My Linux distro is a custom one built using Buildroot via bootlin support.

When running `modetest -M stm -c`, I don't get any resolutions printed. Here's what I get:

# modetest -M stm -c
opened device `STMicroelectronics SoC DRM` on driver `stm` (version 1.0.0 at 20170330)
[  244.014209] EDID block 0 is all zeroes
Connectors:
id	encoder	status		name		size (mm)	modes	encoders
32	0	connected	HDMI-A-1       	0x0		0	31
  props:
	1 EDID:
		flags: immutable blob
		blobs:

		value:
	2 DPMS:
		flags: enum
		enums: On=0 Standby=1 Suspend=2 Off=3
		value: 0
	5 link-status:
		flags: enum
		enums: Good=0 Bad=1
		value: 0
	6 non-desktop:
		flags: immutable range
		values: 0 1
		value: 0
	4 TILE:
		flags: immutable blob
		blobs:

		value:
	33 dithering:
		flags: enum
		enums: Off=0 On=1
		value: 0

Here's what dmesg logs (Increased logging level using: `echo 4 > /sys/module/drm/parameters/debug`):

[  244.004127] [drm:drm_helper_probe_single_connector_modes] [CONNECTOR:32:HDMI-A-1]
[  244.014209] EDID block 0 is all zeroes
[  244.014245] stm32-display 48010000.display-controller: [drm:connector_bad_edid] [CONNECTOR:32:HDMI-A-1] EDID is invalid:
[  244.014269] 	[00] ZERO 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
[  244.014274] 	[00] ZERO 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
[  244.014279] 	[00] ZERO 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
[  244.014284] 	[00] ZERO 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
[  244.014289] 	[00] ZERO 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
[  244.014293] 	[00] ZERO 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
[  244.014298] 	[00] ZERO 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
[  244.014303] 	[00] ZERO 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
[  244.019165] [drm:drm_mode_debug_printmodeline] Modeline "640x480": 60 25175 640 656 752 800 480 490 492 525 0x40 0xa
[  244.019198] [drm:drm_mode_prune_invalid] Not using 640x480 mode: CLOCK_LOW
[  244.019210] [drm:drm_mode_debug_printmodeline] Modeline "800x600": 56 36000 800 824 896 1024 600 601 603 625 0x40 0x5
[  244.019230] [drm:drm_mode_prune_invalid] Not using 800x600 mode: CLOCK_LOW
[  244.019241] [drm:drm_mode_debug_printmodeline] Modeline "800x600": 60 40000 800 840 968 1056 600 601 605 628 0x40 0x5
[  244.019261] [drm:drm_mode_prune_invalid] Not using 800x600 mode: CLOCK_LOW
[  244.019272] [drm:drm_mode_debug_printmodeline] Modeline "848x480": 60 33750 848 864 976 1088 480 486 494 517 0x40 0x5
[  244.019291] [drm:drm_mode_prune_invalid] Not using 848x480 mode: CLOCK_LOW
[  244.019302] [drm:drm_mode_debug_printmodeline] Modeline "1024x768": 60 65000 1024 1048 1184 1344 768 771 777 806 0x40 0xa
[  244.019322] [drm:drm_mode_prune_invalid] Not using 1024x768 mode: CLOCK_HIGH

 I think it is relevant to mention that running `modetest -M nouveau -c` on my laptop with the display 5 inch display connected over HDMI, I do infact get supported modes & EDID does exist:

root@plasma:~# modetest -M nouveau -c
opened device `nVidia Riva/TNT/GeForce/Quadro/Tesla/Tegra K1+` on driver `nouveau` (version 1.4.0 at 0)
Connectors:
id	encoder	status		name		size (mm)	modes	encoders
42	43	connected	HDMI-A-1       	470x260		24	43
  modes:
	index name refresh (Hz) hdisp hss hse htot vdisp vss vse vtot
  #0 800x480 60.00 800 844 932 1056 480 483 489 535 33900 flags: phsync, pvsync; type: preferred, driver
  #1 1920x1080 60.00 1920 2008 2052 2200 1080 1084 1089 1125 148500 flags: phsync, pvsync; type: driver
  #2 1920x1080 59.94 1920 2008 2052 2200 1080 1084 1089 1125 148352 flags: phsync, pvsync; type: driver
  #3 1920x1080 50.00 1920 2448 2492 2640 1080 1084 1089 1125 148500 flags: phsync, pvsync; type: driver
  #4 1280x1024 75.02 1280 1296 1440 1688 1024 1025 1028 1066 135000 flags: phsync, pvsync; type: driver
  #5 1280x720 60.00 1280 1390 1430 1650 720 725 730 750 74250 flags: phsync, pvsync; type: driver
  #6 1280x720 59.94 1280 1390 1430 1650 720 725 730 750 74176 flags: phsync, pvsync; type: driver
  #7 1280x720 50.00 1280 1720 1760 1980 720 725 730 750 74250 flags: phsync, pvsync; type: driver
  #8 1024x768 75.03 1024 1040 1136 1312 768 769 772 800 78750 flags: phsync, pvsync; type: driver
  #9 1024x768 70.07 1024 1048 1184 1328 768 771 777 806 75000 flags: nhsync, nvsync; type: driver
  #10 1024x768 60.00 1024 1048 1184 1344 768 771 777 806 65000 flags: nhsync, nvsync; type: driver
  #11 832x624 74.55 832 864 928 1152 624 625 628 667 57284 flags: nhsync, nvsync; type: driver
  #12 800x600 75.00 800 816 896 1056 600 601 604 625 49500 flags: phsync, pvsync; type: driver
  #13 800x600 72.19 800 856 976 1040 600 637 643 666 50000 flags: phsync, pvsync; type: driver
  #14 800x600 60.32 800 840 968 1056 600 601 605 628 40000 flags: phsync, pvsync; type: driver
  #15 800x600 56.25 800 824 896 1024 600 601 603 625 36000 flags: phsync, pvsync; type: driver
  #16 720x576 50.00 720 732 796 864 576 581 586 625 27000 flags: nhsync, nvsync; type: driver
  #17 720x480 60.00 720 736 798 858 480 489 495 525 27027 flags: nhsync, nvsync; type: driver
  #18 720x480 59.94 720 736 798 858 480 489 495 525 27000 flags: nhsync, nvsync; type: driver
  #19 640x480 75.00 640 656 720 840 480 481 484 500 31500 flags: nhsync, nvsync; type: driver
  #20 640x480 72.81 640 664 704 832 480 489 492 520 31500 flags: nhsync, nvsync; type: driver
  #21 640x480 60.00 640 656 752 800 480 490 492 525 25200 flags: nhsync, nvsync; type: driver
  #22 640x480 59.94 640 656 752 800 480 490 492 525 25175 flags: nhsync, nvsync; type: driver
  #23 720x400 70.08 720 738 846 900 400 412 414 449 28320 flags: nhsync, pvsync; type: driver
  props:
	1 EDID:
		flags: immutable blob
		blobs:

		value:
			00ffffffffffff0012e50021502d3101
			1c130103812f1a782e3585a656489a24
			125054afef0001010101010101010101
			0101010101013e0d200031e037102c58
			3600dc0c1100001e000000ff00300a0a
			0a0a0a0a0a0a0a0a0a0a000000fd0038
			4b1e5315000a202020202020000000fc
			0048444d490a0a0a0a0a0a0a0a0a01f8
			020321714e0607020315961112130414
			051f90230907078301000065030c0010
			008c0ad090204031200c405500b98821
			000018011d8018711c1620582c2500b9
			882100009e011d80d0721c1620102c25
			80b9882100009e011d00bc52d01e20b8
			285540b9882100001e023a80d072382d
			40102c4580b9882100001e00000000d0
	2 DPMS:
		flags: enum
		enums: On=0 Standby=1 Suspend=2 Off=3
		value: 0
	5 link-status:
		flags: enum
		enums: Good=0 Bad=1
		value: 0
	6 non-desktop:
		flags: immutable range
		values: 0 1
		value: 0
	4 TILE:
		flags: immutable blob
		blobs:

		value:
	37 underscan:
		flags: enum
		enums: auto=2 off=0 on=1
		value: 0
	38 underscan hborder:
		flags: range
		values: 0 128
		value: 0
	39 underscan vborder:
		flags: range
		values: 0 128
		value: 0
	40 vibrant hue:
		flags: range
		values: 0 180
		value: 90
	41 color vibrance:
		flags: range
		values: 0 200
		value: 150
	32 scaling mode:
		flags: enum
		enums: None=0 Full=1 Center=2 Full aspect=3
		value: 0
	35 dithering mode:
		flags: enum
		enums: auto=34 off=0 static 2x2=25 dynamic 2x2=17 temporal=33
		value: 34
	36 dithering depth:
		flags: enum
		enums: auto=3 6 bpc=0 8 bpc=2
		value: 3

I also did try OpenSTLinux (FLASH-stm32mp2-openstlinux-6.6-yocto-scarthgap-mpu-v25.06.11.tar.gz) and got no output either.

I also tried to convert the EDID hex (That I got when I probed the display from my laptop) to binary & Then override the kernel to use that EDID instead of probing the display by setting the following bootargs for the kernel:

drm.edid_firmware=edid/800x480.bin drm_kms_helper.edid_firmware=edid/800x480.bin

in "buildroot-external-st/board/stmicroelectronics/stm32mp2/overlay/boot/extlinux/extlinux.conf" file, And I was able to verify that the bootargs did pass successfully, Yet somehow still the logs mentioned EDID being all 0.

1 REPLY 1
aditya_m
Visitor

I was able to solve the problem with a hack after reading https://wiki.archlinux.org/title/Kernel_mode_setting#Forcing_modes_and_EDID

Basically I mounted debugfs & Then override the EDID using the following commands:

mount -t debugfs none /sys/kernel/debug
cat /lib/firmware/edid/800x480.bin > /sys/kernel/debug/dri/0/HDMI-A-1/edid_override

And after this, `modetest` listed the available modes & I was able to print the test pattern.

But why do I have to do this to begin with?