imx6q 修改開機LOGO指南

imx6q 修改開機LOGO指南linux

   在電魚電子從事多年,對imx6q這款產品有點經驗可談,特此分享與你們共同探討,下面是我用SAIL-imx6q修改開機LOGO的作法:git

1 修改u-boot中的LOGO數組

  1 更換logoide

    替換 u-boot-imx/2015.04-r0/git/tools/logos/目錄下的freescale.bmp,注意這裏要替換的圖片必定是256色的位圖,若是是24位色的圖片轉換可能會出錯,形成圖片顯示不正常。函數

    咱們也能夠,直接把本身須要顯示的文件不命名爲freescale.bmp,那就須要本身修改u-boot-imx/2015.04-r0/git/tools/Makefile文件,將LOGO_BMP=後面的路徑設置爲本身的圖片的名稱。網站

    編譯的時候,bmp_logo會將咱們指定的圖片轉換爲數組文件,保存在/u-boot-imx/2015.04-r0/git/mx6qsabresd_config/include/目錄下的bmp_logo.h、bmp_logo_data.h中spa

  2 將圖片居中顯示.net

    修改 u-boot-imx/2015.04-r0/git/drivers/video/cfb_console.c圖片

    在函數static void *video_logo(void)中修改terminal

    splash_get_pos(&video_logo_xpos, &video_logo_ypos);

         

        if(video_logo_xpos==0&&video_logo_ypos==0)//這裏是增長的代碼,設置圖片居中顯示

        {

                video_logo_xpos= (VIDEO_VISIBLE_COLS - BMP_LOGO_WIDTH)>>1;

                video_logo_ypos= (VIDEO_VISIBLE_ROWS - BMP_LOGO_HEIGHT)>>1;

        }

  3 去掉編譯信息

    在函數static void *video_logo(void)函數中註釋掉下面的代碼

    sprintf(info, " %s", version_string);

         

        space = (VIDEO_COLS - VIDEO_INFO_X) / VIDEO_FONT_WIDTH;

        len = strlen(info);

 

 

        if (len > space) {

                int xx = VIDEO_INFO_X, yy = VIDEO_INFO_Y;

                uchar *p = (uchar *) info;

                while (len) {

                        if (len > space) {

                                video_drawchars(xx, yy, p, space);

                                len -= space;

 

 

                                p = (uchar *) p + space;

 

 

                                if (!y_off) {

                                        xx += VIDEO_FONT_WIDTH;

                                        space--;

                                }

                                yy += VIDEO_FONT_HEIGHT;

 

 

                                y_off++;

                        } else {

                                video_drawchars(xx, yy, p, len);

                                len = 0;

                        }

                }

        } else

                video_drawstring(VIDEO_INFO_X, VIDEO_INFO_Y, (uchar *) info);

                

2 修改Linux啓動的logo

  1 生成logo文件

    生成logo文件,咱們須要用png圖片來轉換

    在terminal中運行下面的命令

    pngtopnm car.png > car.pnm         #轉換png成pnm格式

        pnmquant 224 car.pnm > car224.pnm       #轉換像素數爲224

        pnmtoplainpnm car224.pnm > logo_car_clut224.ppm

  2 將logo_car_clut224.ppm拷貝到/kernel-source/drivers/video/logo/目錄下

  

  3 在/kernel-source/drivers/video/logo/Kconfig下增長

    config LOGO_CAR224

        bool "Standard car logo"

        default y

        

    在/kernel-source/drivers/video/logo/Makefile下增長

    obj-$(CONFIG_LOGO_CAR224)                        += logo_car_clut224.o

  

  4 執行bitbake -c menuconfig -v linux-imx 

    在menuconfig中選擇Standard car logo

    

  5 在/kernel-source/drivers/video/logo/logo.c中的

    const struct linux_logo * __init_refok fb_find_logo(int depth)函數中

    if (depth >= 8) {

    。。。。。。。

    }

    裏面添加

    #ifdef CONFIG_LOGO_CAR224

                /* Generic car logo */

                logo = &logo_car_clut224;

    #endif

    

    在/kernel-source/include/linux/linux_logo.h

    中添加extern const struct linux_logo logo_car_clut224;

    

  6 去掉根據CPU的數目顯示logo,只顯示一個logo

    將/kernel-source/drivers/video/fbmem.c

    中函數int fb_show_logo(struct fb_info *info, int rotate)

    將y = fb_show_logo_line(info, rotate, fb_logo.logo, 0,

                              num_online_cpus());

        改成

        y = fb_show_logo_line(info, rotate, fb_logo.logo, 0,

                              /*num_online_cpus()*/1);

                              

  7 設置logo居中顯示

    修改 /kernel-source/drivers/video/fbmem.c中的

    static void fb_do_show_logo(struct fb_info *info, struct fb_image *image,

                            int rotate, unsigned int num)函數

    代碼以下:

    unsigned int x;

        unsigned int xoff,yoff; 

        //添加的代碼 ,設置logo居中顯示

        xoff = (info->var.xres - num * (fb_logo.logo->width ))>>1; 

 

 

        yoff = (info->var.yres -  (fb_logo.logo->height ))>>1;

        ////////////////////////////////////////////////////////////

        if (rotate == FB_ROTATE_UR) {

                //添加的代碼,設置logo居中顯示 

                image->dx = xoff ;

                image->dy = yoff ;

                ///////////////////////////////

                for (x = 0;

                     x < num && image->dx + image->width <= info->var.xres;

                     x++) {

                        info->fbops->fb_imageblit(info, image);

                        printk(KERN_ALERT"end\n" );

                        image->dx += image->width + 8;

                }

        } 

        

        修改函數int fb_prepare_logo(struct fb_info *info, int rotate)

        在函數的結尾

        return fb_prepare_extra_logos(info, fb_logo.logo->height, yres);

        改成

        return fb_prepare_extra_logos(info, fb_logo.logo->height, yres)+((info->var.yres )>>1);

        從新編譯就大功告成。

但願和你們共同探討該領域問題,盡情留言。歡迎到電魚電子網站(www.dianyu.net)發表意見。

相關文章
相關標籤/搜索