2015年4月21日 星期二

uboot 改圖

(uboot)/common/lcd.c
static int lcd_clear (cmd_tbl_t * cmdtp, int flag, int argc, char *argv[])
{
...
   /* Paint the logo and retrieve LCD base address */
    debug ("[LCD] Drawing the logo...\n");
    lcd_console_address = lcd_logo ();
}
static void *lcd_logo (void)
{
#ifdef CONFIG_SPLASH_SCREEN
    char *s; 
    ulong addr;
    static int do_splash = 1;

    if (do_splash && (s = getenv("splashimage")) != NULL) {
        int x = 0, y = 0;
        do_splash = 0;

        addr = simple_strtoul (s, NULL, 16);

#ifdef CONFIG_SPLASH_SCREEN_ALIGN
        if ((s = getenv ("splashpos")) != NULL) {
            if (s[0] == 'm')
                x = BMP_ALIGN_CENTER;
            else
                x = simple_strtol (s, NULL, 0); 

            if ((s = strchr (s + 1, ',')) != NULL) {
                if (s[1] == 'm')
                    y = BMP_ALIGN_CENTER;
                else
                    y = simple_strtol (s + 1, NULL, 0); 
            }
        }
#endif /* CONFIG_SPLASH_SCREEN_ALIGN */

#ifdef CONFIG_VIDEO_BMP_GZIP
        bmp_image_t *bmp = (bmp_image_t *)addr;
        unsigned long len;

        if (!((bmp->header.signature[0]=='B') &&
              (bmp->header.signature[1]=='M'))) {
            addr = (ulong)gunzip_bmp(addr, &len);
        }
#endif

        if (lcd_display_bitmap (addr, x, y) == 0) {
            return ((void *)lcd_base);
        }
    }   
#endif /* CONFIG_SPLASH_SCREEN */

#ifdef CONFIG_LCD_LOGO
    bitmap_plot (0, 0); 
#endif /* CONFIG_LCD_LOGO */

#ifdef CONFIG_LCD_INFO
    console_col = LCD_INFO_X / VIDEO_FONT_WIDTH;
    console_row = LCD_INFO_Y / VIDEO_FONT_HEIGHT;
    lcd_show_board_info();
#endif /* CONFIG_LCD_INFO */

#if defined(CONFIG_LCD_LOGO) && !defined(CONFIG_LCD_INFO_BELOW_LOGO)
    return ((void *)((ulong)lcd_base + BMP_LOGO_HEIGHT * lcd_line_length));
#else
    return ((void *)lcd_base);
#endif /* CONFIG_LCD_LOGO && !CONFIG_LCD_INFO_BELOW_LOGO */
} 
這邊透過關鍵字splashimage就知道可以有用SplashScreen。

include/configs/mx6q_sabresd.h (還有個 mx6q_sabresd_android.h)
#define CONFIG_SPLASH_SCREEN
#ifdef CONFIG_SPLASH_SCREEN
    /*  
     * Framebuffer and LCD
     */
    #define CONFIG_LCD
    #define CONFIG_IPU_V3H
    #defineCONFIG_VIDEO_MX5
    #define CONFIG_IPU_CLKRATE  260000000
    #define CONFIG_SYS_CONSOLE_ENV_OVERWRITE
    #define CONFIG_SYS_CONSOLE_OVERWRITE_ROUTINE
    #define CONFIG_SYS_CONSOLE_IS_IN_ENV
    #define LCD_BPP     LCD_COLOR16
    #define CONFIG_CMD_BMP
    #define CONFIG_BMP_8BPP
    #define CONFIG_FB_BASE  (TEXT_BASE + 0x300000)
    #define CONFIG_SPLASH_SCREEN_ALIGN
    #define CONFIG_SYS_WHITE_ON_BLACK

    #define CONFIG_IMX_PWM
    #define IMX_PWM1_BASE    PWM1_BASE_ADDR
    #define IMX_PWM2_BASE    PWM2_BASE_ADDR
#endif
#endif              /* __CONFIG_H */
board/freescale/common/Makefile
COBJS-${CONFIG_VIDEO_MX5} += fsl_bmp_600x400.o fsl_bmp_reversed_600x400.o
在 board/freescale/common/ 找到 fsl_bmp_600x400.c
bin2txt.py來將bmp轉bin 指令: python bin2txt.pyw xxx.bmp (需安裝 python 和 python-tk)

board/freescale/mx6q_sabresd/mx6q_sabresd.c
#ifdef CONFIG_SPLASH_SCREEN
void setup_splash_image(void)
{
 char *s;
 ulong addr;

 s = getenv("splashimage");

 if (s != NULL) {
  addr = simple_strtoul(s, NULL, 16);

#if defined(CONFIG_ARCH_MMU)
  addr = ioremap_nocache(iomem_to_phys(addr),
    fsl_bmp_reversed_600x400_size);
#endif
  memcpy((char *)addr, (char *)fsl_bmp_reversed_600x400,
    fsl_bmp_reversed_600x400_size);
 }
}
#endif
#endif /* !CONFIG_MXC_EPDC */

沒有留言:

張貼留言