Difference between revisions of "U-Boot Splash Screen"

From ArmadeusWiki
Jump to: navigation, search
m (Test it)
Line 1: Line 1:
{{Under Construction}}
 
 
 
=Introduction=
 
=Introduction=
On this page you will learn how to activate LCD support in U-Boot and display a Splash Screen at boot. The following instructions have only be tested on [[OPOS6UL]].
+
On this page you will learn how to activate LCD support in U-Boot and display a Splash Screen at boot.
 +
{{Note|The following instructions have only be tested on [[OPOS6UL]].}}
  
 
=Installation=
 
=Installation=
Line 31: Line 30:
 
BIOS> setenv splashsource mmc_fs
 
BIOS> setenv splashsource mmc_fs
 
</pre>
 
</pre>
 +
 +
=Continuity with Linux Boot Logo=
 +
* If you want Linux to keep your U-Boot Logo during boot process, then some tweaks are needed:
 +
** define CONFIG_SYS_MEM_TOP_HIDE in U-Boot configuration file, here we reserve 2MBytes: <source lang="c">#define CONFIG_SYS_MEM_TOP_HIDE        (2 << 20)</source>
 +
* Force framebuffer RAM address in U-Boot LCD driver ([[OPOS6UL]] has 256MBytes (0x10000000) RAM starting at physical 0x80000000):<source lang="diff">@@ -197,8 +197,8 @@
 +
panel.memSize = mode.xres * mode.yres * panel.gdfBytesPP;
 +
 +
/* Allocate framebuffer */
 +
- fb = memalign(ARCH_DMA_MINALIGN,
 +
-       roundup(panel.memSize, ARCH_DMA_MINALIGN));
 +
+ fb = (void *)0x8fe00000; /*memalign(ARCH_DMA_MINALIGN,
 +
+       roundup(panel.memSize, ARCH_DMA_MINALIGN));*/
 +
if (!fb) {
 +
printf("MXSFB: Error allocating framebuffer!\n");
 +
return NULL;
 +
</source>
 +
 +
* Tell Linux to not print cursor on Framebuffer and to not use last 2M of RAM: <pre class="apf">BIOS> setenv extrabootargs vt.global_cursor_default=0 mem=248M</pre>
 +
 +
* Force framebuffer RAM address to same value in Linux LCD driver: <source lang="diff">@@ -825,17 +824,18 @@
 +
        var->vmode = FB_VMODE_NONINTERLACED;
 +
 +
        /* Memory allocation for framebuffer */
 +
+#define FORCED_FB_ADDR 0x8fe00000
 +
        fb_size = SZ_2M;
 +
-      fb_virt = dma_alloc_wc(dev, PAGE_ALIGN(fb_size), &fb_phys, GFP_KERNEL);
 +
+      fb_virt = ioremap_wc(FORCED_FB_ADDR, fb_size);
 +
        if (!fb_virt)
 +
                return -ENOMEM;
 +
 +
+      fb_phys = FORCED_FB_ADDR;
 +
        fb_info->fix.smem_start = fb_phys;
 +
        fb_info->screen_base = fb_virt;
 +
        fb_info->screen_size = fb_info->fix.smem_len = fb_size;
 +
 +
-      if (mxsfb_restore_mode(host, vmode))
 +
-              memset(fb_virt, 0, fb_size);
 +
+      mxsfb_restore_mode(host, vmode);
 +
 +
        return 0;
 +
}</source>
 +
 +
* Reflash all that on your board and... That's it ! ;-)
  
 
=Links=
 
=Links=
 
* http://www.denx.de/wiki/DULG/UBootSplashScreen
 
* http://www.denx.de/wiki/DULG/UBootSplashScreen
 +
 +
[[Category:Boot Logo]]

Revision as of 16:12, 4 April 2017

Introduction

On this page you will learn how to activate LCD support in U-Boot and display a Splash Screen at boot.

Note Note: The following instructions have only be tested on OPOS6UL.


Installation

  • Save your image as BMP file (in Gimp use Run-Length (RLE) encoding, no alpha channel and no color informations (compatibility options))
  • Activate LCD in U-Boot (here ST0700):
BIOS> setenv videomode video=ctfb:x:800,y:480,depth:18,pclk:33033,le:8,ri:4,up:2,lo:4,hs:64,vs:4,sync:0,vmode:0

Test it

BIOS> tftpboot ${loadaddr} xxx.bmp
BIOS> bmp info ${loadaddr}
Image size    : 296 x 72
Bits per pixel: 8
Compression   : 0
BIOS> bmp display ${loadaddr} 100 50

Deploy it

  • Here we assume that logo is stored in /boot directory of rootfs eMMC partition as logo.bmp:
BIOS> setenv splashimage 0x80000000
BIOS> setenv splashfile /boot/logo.bmp
BIOS> setenv splashsource mmc_fs

  • If you want Linux to keep your U-Boot Logo during boot process, then some tweaks are needed:
    • define CONFIG_SYS_MEM_TOP_HIDE in U-Boot configuration file, here we reserve 2MBytes:
      #define CONFIG_SYS_MEM_TOP_HIDE         (2 << 20)
      
  • Force framebuffer RAM address in U-Boot LCD driver (OPOS6UL has 256MBytes (0x10000000) RAM starting at physical 0x80000000):
    @@ -197,8 +197,8 @@
     	panel.memSize = mode.xres * mode.yres * panel.gdfBytesPP;
     
     	/* Allocate framebuffer */
    -	fb = memalign(ARCH_DMA_MINALIGN,
    -		      roundup(panel.memSize, ARCH_DMA_MINALIGN));
    +	fb = (void *)0x8fe00000; /*memalign(ARCH_DMA_MINALIGN,
    +		      roundup(panel.memSize, ARCH_DMA_MINALIGN));*/
     	if (!fb) {
     		printf("MXSFB: Error allocating framebuffer!\n");
     		return NULL;
    
  • Tell Linux to not print cursor on Framebuffer and to not use last 2M of RAM:
    BIOS> setenv extrabootargs vt.global_cursor_default=0 mem=248M
  • Force framebuffer RAM address to same value in Linux LCD driver:
    @@ -825,17 +824,18 @@
            var->vmode = FB_VMODE_NONINTERLACED;
    
            /* Memory allocation for framebuffer */
    +#define FORCED_FB_ADDR 0x8fe00000
            fb_size = SZ_2M;
    -       fb_virt = dma_alloc_wc(dev, PAGE_ALIGN(fb_size), &fb_phys, GFP_KERNEL);
    +       fb_virt = ioremap_wc(FORCED_FB_ADDR, fb_size);
            if (!fb_virt)
                    return -ENOMEM;
    
    +       fb_phys = FORCED_FB_ADDR;
            fb_info->fix.smem_start = fb_phys;
            fb_info->screen_base = fb_virt;
            fb_info->screen_size = fb_info->fix.smem_len = fb_size;
    
    -       if (mxsfb_restore_mode(host, vmode))
    -               memset(fb_virt, 0, fb_size);
    +       mxsfb_restore_mode(host, vmode);
    
            return 0;
     }
    
  • Reflash all that on your board and... That's it ! ;-)

Links