[U-Boot] [PATCH] sunxi: video: Add extra modes and allow selecting the mode via hdmi_mode env
Hans de Goede
hdegoede at redhat.com
Sun Nov 23 17:12:09 CET 2014
Add the following extra modes:
1280x720 at 50
1920x1080 at 60
1920x1200 at 60
And allow selecting them by setting (and then saving and rebooting) a
hdmi_mode env variable to the name of the mode.
Also make the reserved fb mem slightly larger to allow 1920x1200 to work.
Signed-off-by: Hans de Goede <hdegoede at redhat.com>
---
drivers/video/sunxi_display.c | 91 +++++++++++++++++++++++++++++++++++++-----
include/configs/sunxi-common.h | 2 +-
2 files changed, 81 insertions(+), 12 deletions(-)
diff --git a/drivers/video/sunxi_display.c b/drivers/video/sunxi_display.c
index 3060bee..349e36c 100644
--- a/drivers/video/sunxi_display.c
+++ b/drivers/video/sunxi_display.c
@@ -355,15 +355,14 @@ retry:
}
}
-void *video_hw_init(void)
+static void video_get_mode(char *modestr, struct fb_videomode *mode)
{
- static GraphicDevice *graphic_device = &sunxi_display.graphic_device;
- /*
- * Vesa standard 1024x768 at 60
- * 65.0 1024 1032 1176 1344 768 771 777 806 -hsync -vsync
- */
- struct fb_videomode mode = {
- .name = "1024x768",
+ const struct fb_videomode modes[] = { {
+ /*
+ * Vesa standard 1024x768 at 60
+ * 65.0 1024 1032 1176 1344 768 771 777 806 -hsync -vsync
+ */
+ .name = "1024x768 at 60",
.refresh = 60,
.xres = 1024,
.yres = 768,
@@ -377,7 +376,76 @@ void *video_hw_init(void)
.sync = 0,
.vmode = 0,
.flag = 0,
- };
+ } , {
+ .name = "1280x720 at 50",
+ .refresh = 50,
+ .xres = 1280,
+ .yres = 720,
+ .pixclock = 74250,
+ .left_margin = 440,
+ .right_margin = 220,
+ .upper_margin = 20,
+ .lower_margin = 5,
+ .hsync_len = 40,
+ .vsync_len = 5,
+ .sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
+ .vmode = FB_VMODE_NONINTERLACED,
+ .flag = 0,
+ } , {
+ .name = "1920x1080 at 60",
+ .refresh = 60,
+ .xres = 1920,
+ .yres = 1080,
+ .pixclock = 148500,
+ .left_margin = 88,
+ .right_margin = 148,
+ .upper_margin = 36,
+ .lower_margin = 4,
+ .hsync_len = 44,
+ .vsync_len = 5,
+ .sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
+ .vmode = FB_VMODE_NONINTERLACED,
+ .flag = 0,
+ } , {
+ .name = "1920x1200 at 60",
+ .refresh = 60,
+ .xres = 1920,
+ .yres = 1200,
+ .pixclock = 154000,
+ .left_margin = 48,
+ .right_margin = 80,
+ .upper_margin = 26,
+ .lower_margin = 3,
+ .hsync_len = 32,
+ .vsync_len = 6,
+ .sync = FB_SYNC_HOR_HIGH_ACT,
+ .vmode = FB_VMODE_NONINTERLACED,
+ .flag = 0,
+ } };
+ int i;
+
+ if (!modestr) {
+ *mode = modes[0];
+ return;
+ }
+
+ for (i = 0; i < ARRAY_SIZE(modes); i++) {
+ if (strcmp(modes[i].name, modestr) == 0)
+ break;
+ }
+ if (i >= ARRAY_SIZE(modes)) {
+ eprintf("Mode %s not available, falling back to %s\n",
+ modestr, modes[0].name);
+ i = 0;
+ }
+
+ *mode = modes[i];
+}
+
+void *video_hw_init(void)
+{
+ static GraphicDevice *graphic_device = &sunxi_display.graphic_device;
+ struct fb_videomode mode;
int ret;
memset(&sunxi_display, 0, sizeof(struct sunxi_display));
@@ -390,10 +458,11 @@ void *video_hw_init(void)
if (!ret)
return NULL;
- printf("HDMI connected.\n");
sunxi_display.enabled = true;
+ video_get_mode(getenv("hdmi_mode"), &mode);
+
+ printf("HDMI connected, setting up a %s console.\n", mode.name);
- printf("Setting up a %s console.\n", mode.name);
sunxi_engines_init();
sunxi_mode_set(&mode, gd->fb_base - CONFIG_SYS_SDRAM_BASE);
diff --git a/include/configs/sunxi-common.h b/include/configs/sunxi-common.h
index 7b958f8..a6cdffb 100644
--- a/include/configs/sunxi-common.h
+++ b/include/configs/sunxi-common.h
@@ -202,7 +202,7 @@
* The amount of RAM that is reserved for the FB. This will not show up as
* RAM to the kernel, but will be reclaimed by a KMS driver in future.
*/
-#define CONFIG_SUNXI_FB_SIZE (8 << 20)
+#define CONFIG_SUNXI_FB_SIZE (9 << 20)
/* Do we want to initialize a simple FB? */
#define CONFIG_VIDEO_DT_SIMPLEFB
--
2.1.0
More information about the U-Boot
mailing list