
Hi Stefano, 2014/1/8 Stefano Babic sbabic@denx.de:
Hi Christian,
On 08/01/2014 08:24, Christian Gmeiner wrote:
This new function is used to set all display-timings properties based on fb_videomode.
display-timings { timing0 { clock-frequency = <25000000>; hactive = <640>; vactive = <480>; hback-porch = <48>; hfront-porch = <16>; vback-porch = <31>; vfront-porch = <12>; hsync-len = <96>; vsync-len = <2>; }; };
Signed-off-by: Christian Gmeiner christian.gmeiner@gmail.com
common/fdt_support.c | 23 +++++++++++++++++++++++ include/fdt_support.h | 3 +++ 2 files changed, 26 insertions(+)
diff --git a/common/fdt_support.c b/common/fdt_support.c index 4e32b02..cf81a4b 100644 --- a/common/fdt_support.c +++ b/common/fdt_support.c @@ -11,6 +11,7 @@ #include <stdio_dev.h> #include <linux/ctype.h> #include <linux/types.h> +#include <linux/fb.h> #include <asm/global_data.h> #include <libfdt.h> #include <fdt_support.h> @@ -1342,6 +1343,28 @@ err_size: #endif
/*
- fdt_add_display_timings: add display-timings properties
- @fdt: ptr to device tree
- @noff: node to update
- @mode: ptr to b_videomode
- */
+void fdt_add_display_timings(void *fdt, int noff, struct fb_videomode *mode) +{
if (noff != -FDT_ERR_NOTFOUND) {
fdt_setprop_u32(fdt, noff, "clock-frequency", mode->pixclock);
fdt_setprop_u32(fdt, noff, "hactive", mode->xres);
fdt_setprop_u32(fdt, noff, "vactive", mode->yres);
fdt_setprop_u32(fdt, noff, "hback-porch", mode->left_margin);
fdt_setprop_u32(fdt, noff, "hfront-porch", mode->right_margin);
fdt_setprop_u32(fdt, noff, "vback-porch", mode->upper_margin);
fdt_setprop_u32(fdt, noff, "vfront-porch", mode->lower_margin);
fdt_setprop_u32(fdt, noff, "hsync-len", mode->hsync_len);
fdt_setprop_u32(fdt, noff, "vsync-len", mode->vsync_len);
}
+}
+/*
- Verify the physical address of device tree node for a given alias
- This function locates the device tree node of a given alias, and then
diff --git a/include/fdt_support.h b/include/fdt_support.h index 9871e2f..1c54880 100644 --- a/include/fdt_support.h +++ b/include/fdt_support.h @@ -82,6 +82,9 @@ int fdt_set_phandle(void *fdt, int nodeoffset, uint32_t phandle); unsigned int fdt_create_phandle(void *fdt, int nodeoffset); int fdt_add_edid(void *blob, const char *compat, unsigned char *buf);
+struct fb_videomode; +void fdt_add_display_timings(void *blob, int noff, struct fb_videomode *mode);
int fdt_verify_alias_address(void *fdt, int anode, const char *alias, u64 addr); u64 fdt_get_base_address(void *fdt, int node);
Agree that we have to sync u-boot and kernel, and this can be a way in the short term.
I am asking if this is in the long term the best way to do it. You are converting EDID values to fb_videomode *mode, and then again to the device node as required by DT. We have already had some talks about moving U-Boot configuration to DT, that is U-Boot can be also configured by a DT file (see for example support for Nvidia processors, they already support DT in U-Boot).
The problem for me here is that DT only does not work in my case. As it is possible to attach different panels/displays via lvds (different timings and resolutions) we have put an at24 on our print, which contains the suitable EDID data.
So I need to readout the at24 every boot and need to manipulate the loaded (emmc) DT.
Anatolji, what do you think as best solution we have to follow for display setting ?
thanks -- Christian Gmeiner, MSc