當(dāng)前位置:首頁 > 嵌入式培訓(xùn) > 嵌入式學(xué)習(xí) > 講師博文 > LINUX 啟動logo 總結(jié)
LINUX 啟動logo 總結(jié)
近在imx6上需要調(diào)試linux下啟動logo。其實linux啟動logo 以前沒少調(diào),但這次弄了好久,也發(fā)現(xiàn)以前調(diào)過的沒有積累。
之所以這次logo弄了很久是因為fsl bsp 實現(xiàn)keep uboot logo to kernel ,但又在我使用的BSP上沒有完全弄好。話說那個還是
有很牛逼,簡單來說就是uboot實現(xiàn)好logo,然后kernel 中不需要對相應(yīng)的顯示時鐘進行重新初始化,還有很多其他的類似一樣
的道理,就是相信uboot中已經(jīng)弄好了。廢話到此。說說一般的linux 啟動logo。
一,企鵝法(224級,或者224色)
企鵝圖片的文件名logo_linux_clut224.ppm,在driver/video/logo目錄下。采用netpbm 工具生成想要替換的logo,這里要注
意一下圖片的尺寸大小 。
例如將PNG格式的圖片轉(zhuǎn)換成logo_linux_clut224.ppm:
# pngtopnm my.png > my.pnm
# pnmquant 224 my.pnm > logo224.pnm
# pnmtoplainpnm logo224.pnm > logo_linux_clut224.ppm
Note: 可能會出現(xiàn)如下錯誤提示
drivers/video/logo/logo_linux_clut224.ppm: Binary PNM is not supported
Use pnmnoraw(1) to convert it to ASCII PNM
這個可能是因為你的ppm 圖片是bin格式,需要轉(zhuǎn)換成ascii 格式。方法如下:
pnmnoraw logo_linux_clut224.ppm > logo_linux_clut224_ascii.ppm
替換目錄中的文件重新編譯就OK了。當(dāng)然這時候你會發(fā)現(xiàn)顯示位置需要調(diào)整。默認是左上角對齊。產(chǎn)品中可能更多是中心對齊。
中心對齊的方法。
1,修改drivers/video/fbmem.c fb_show_logo_line函數(shù)中,修改如下
//image.dx = 0; //左上角 x起點
//image.dy = y; //調(diào)用時指定的參數(shù) y起點
image.dx = (info->var.xres / 2) - (image.width / 2); //中心
image.dy = (info->var.yres / 2) - (image.height / 2); //中心
image.width = logo->width;
image.height = logo->height;
Note:info->var.xres和info->var.yres是分辨率大小,image.width,image.height是logo圖片的大小。
起點位置的修改
2,修改drivers/video/console/fbcon.c fbcon_prepare_logo函數(shù)里,修改如下
logo_height = fb_prepare_logo(info, ops->rotate);
logo_height += (info->var.yres / 2) - (logo_height / 2);
結(jié)束位置的修改
這里需要補充一點,就是關(guān)于boot logo 的配置與光標(biāo) cursor的問題(第二種方法里面說吧)。
Device Drivers ---> Graphics support --->
[*]Boot logo --->
[*] Standard 224-color Linux logo
支持 kernel console,不選看不到 logo:
Device Drivers ---> Graphics support --->
Console display driver support --->
<*> Framebuffer Console support
二,真彩色TFT LINUX LOGO (使用此方法比較簡單,更能滿足客戶的需求)
顯示圖片可以是rgb565 ,不局限于原來的224色 ,方法相當(dāng)于直接將要顯示的圖片輸出到Framebuffer。記錄一下方法吧。
1, 生成貍貓----增加三個文件。
true_lanrry_logo.h //LCD顯示信息,深度及聲明
lanrry_logo_data.h //定義的圖片的數(shù)據(jù),我采用ImageLCD工具取模
framebuffer_logo.c //實現(xiàn)打印數(shù)據(jù)到framebuffer
均放在drivers/video目錄下,并且修改Makefile ,添加framebuffer_logo.c。
2,貍貓換太子----修改drivers/video/fbmem.c里的代碼
a,添加 #define TRUE_COLOR
b,修改如下:
+#ifdef TRUE_COLOR
+#include "truecolor_logo.h"
+#endif
c,修改函數(shù)int fb_show_logo(struct fb_info *info, int rotate)
{
//貍貓換太子
+#ifdef TRUE_COLOR
+fb_show_truecolor_logo(info);
+return 1;
#else
int y;
y = fb_show_logo_line(info, rotate, fb_logo.logo, 0,
num_online_cpus());
num_online_cpus cpu 數(shù)量,linux logo 企鵝數(shù)量。
d,修改fb_prepare_logo函數(shù)以改變高度,該函數(shù)的后return處改為
#ifdef TRUE_COLOR
return fb_prepare_extra_logos(info, YRES, YRES);
#else
return fb_prepare_extra_logos(info, fb_logo.logo->height, yres);
#endif
重新編譯完之后,就能全部顯示
這種方法是采用替換boot logo 。全屏顯示的時候,也是會發(fā)現(xiàn)有光標(biāo)問題。解決方法如下:
修改drivers/video/console/bitblit.c文件的bit_cursor函數(shù),在該函數(shù)結(jié)尾處的 。
if (err)
soft_cursor(info, &cursor);
改為
if (0)
soft_cursor(info, &cursor);