[U-Boot] [PATCH 1/5] edid: add function to convert edid to fb_videomode

Eric Nelson eric.nelson at boundarydevices.com
Fri Jan 10 22:36:09 CET 2014


Hi Christian,

On 01/08/2014 12:24 AM, Christian Gmeiner wrote:
> There may be some custom boards in the field which have
> an seperate eeprom chip to store edid informations in it.
> To make use of those edid information in the board code
> this patch add a function to convert edid to fb_videomode.
>
> Signed-off-by: Christian Gmeiner <christian.gmeiner at gmail.com>
> ---
>   common/edid.c  |   29 +++++++++++++++++++++++++++++
>   include/edid.h |    3 +++
>   2 files changed, 32 insertions(+)
>
> diff --git a/common/edid.c b/common/edid.c
> index e66108f..8841c25 100644
> --- a/common/edid.c
> +++ b/common/edid.c
> @@ -12,6 +12,7 @@
>
>   #include <common.h>
>   #include <edid.h>
> +#include <linux/fb.h>
>   #include <linux/ctype.h>
>   #include <linux/string.h>
>
> @@ -288,3 +289,31 @@ void edid_print_info(struct edid1_info *edid_info)
>   	if (!have_timing)
>   		printf("\tNone\n");
>   }
> +
> +void edid_to_fb_videomode(struct edid1_info *edid, struct fb_videomode *mode)
> +{
> +        struct edid_monitor_descriptor *monitor = &edid->monitor_details.descriptor[0];
> +        unsigned char *bytes = (unsigned char *)monitor;
> +        struct edid_detailed_timing *timing = (struct edid_detailed_timing *)monitor;
> +
> +        uint32_t pixclock = EDID_DETAILED_TIMING_PIXEL_CLOCK(*timing);
> +        uint32_t h_blanking = EDID_DETAILED_TIMING_HORIZONTAL_BLANKING(*timing);
> +        uint32_t h_active = EDID_DETAILED_TIMING_HORIZONTAL_ACTIVE(*timing);
> +        uint32_t h_sync_offset = EDID_DETAILED_TIMING_HSYNC_OFFSET(*timing);
> +        uint32_t h_sync_width = EDID_DETAILED_TIMING_HSYNC_PULSE_WIDTH(*timing);
> +        uint32_t v_blanking = EDID_DETAILED_TIMING_VERTICAL_BLANKING(*timing);
> +        uint32_t v_active = EDID_DETAILED_TIMING_VERTICAL_ACTIVE(*timing);
> +        uint32_t v_sync_offset = EDID_DETAILED_TIMING_VSYNC_OFFSET(*timing);
> +        uint32_t v_sync_width = EDID_DETAILED_TIMING_VSYNC_PULSE_WIDTH(*timing);
> +
> +        mode->name = "EDID";

I think this wants to be KHZTOPICOS((pixclock/1000)), since the pixclock
returned above seems to be in Hz.

> +        mode->pixclock = pixclock;
> +        mode->yres = v_active;
> +        mode->xres = h_active;
> +        mode->left_margin = h_blanking - h_sync_offset - h_sync_width;
> +        mode->right_margin = h_sync_offset;
> +        mode->upper_margin = v_blanking - v_sync_offset - v_sync_width;
> +        mode->lower_margin = v_sync_offset;
> +        mode->hsync_len = h_sync_width;
> +        mode->vsync_len = v_sync_width;
> +}

I just tried gluing this up for use in the Nitrogen6X HDMI channel,
but found that this is more difficult than expected.

Apparently the i.MX6 clock tree doesn't (yet) support use with
the 1080P monitor I have connected.

Everything else looks okay though.

Regards,


Eric



More information about the U-Boot mailing list