亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

Uboot中支持lcd和hdmi顯示不同的logo圖片

2019-11-09 15:41:34
字體:
來源:轉載
供稿:網友

在lcd為豎屏,hdmi顯示橫屏的情況下,如果按照默認的uboot顯示框架來看,只能保證lcd或者hdmi上面顯示出來的圖片一個是正的,另外一個是旋轉了90度的樣子。 為了能是lcd和hdmi同時支持顯示圖片都是正的,需要對uboot的框架做修改。如果硬件支持旋轉功能的話,就可直接使用硬件旋轉,不需要軟件來調整。 由于項目原因,折騰了一把這個流程,具體實現記錄下: 1:由于硬件不支持rotation功能,在軟件上采用的方法是準備兩份logo資源,解析后將兩份數據送到不同的顯示設備上面做顯示。 在解析logo的時候需要解析兩份資源:

static int splash_image_load(void){ int ret; char *filename,*filename_hdmi; void *splash_image_addr,*splash_image_hdmi_addr; char splash_image_char[16], splash_image_hdmi_char[16]; //分配給lcd資源的地址 splash_image_addr = memalign(128, CONFIG_SYS_VIDEO_LOGO_MAX_SIZE); if(splash_image_addr == NULL) { 2:添加對hdmi驅動中的支持和在cfb_console.c中添加解析圖片的支持

static int video_init(void){ unsigned char color8; pGD = video_hw_init(); if (pGD == NULL) return -1; //獲取驅動中的hdmi的fb的信息video_hw_hdmi_init在fb的驅動中實現 pGD_HDMI = video_hw_hdmi_init(); if (pGD_HDMI == NULL) return -1; ...}static void *video_logo(void){ char info[128]; int space, len; __maybe_unused int y_off = 0; __maybe_unused ulong addr; __maybe_unused char *s,*s_hdmi; splash_get_pos(&video_logo_xpos, &video_logo_ypos); //splash_get_pos(&video_logo_xpos, &video_logo_ypos); video_hdmi_logo_xpos = BMP_ALIGN_CENTER; //init xpos and ypos video_hdmi_logo_ypos = BMP_ALIGN_CENTER;#ifdef CONFIG_SPLASH_SCREEN //從env中拿到lcd和hdmi圖片的地址 s = getenv("splashimage"); s_hdmi = getenv("splashimagehdmi"); if (s != NULL) { splash_screen_prepare(); addr = simple_strtoul(s, NULL, 16); //解析lcd的logo資源成送顯的數據 if (video_display_bitmap(addr, video_logo_xpos, video_logo_ypos) == 0) { video_logo_height = 0; //return ((void *) (video_fb_address)); } } if (s_hdmi != NULL) { //printf("xieshsh debug video display/n"); splash_screen_prepare(); addr = simple_strtoul(s_hdmi, NULL, 16); //解析lcd的hdmi資源成送顯的數據 if (video_display_hdmi_bitmap(addr, video_hdmi_logo_xpos, video_hdmi_logo_ypos) == 0) { video_hdmi_logo_ypos = 0; return ((void *) (video_fb_address)); } }

3:接下來需要對添加對hdmi logo的解析成fb的數據

int video_display_hdmi_bitmap(ulong bmp_image, int x, int y){ ushort xcount, ycount; uchar *fb; bmp_image_t *bmp = (bmp_image_t *) bmp_image; uchar *bmap; ushort padded_line; unsigned long width, height, bpp; unsigned colors; unsigned long compression; bmp_color_table_entry_t cte;#ifdef CONFIG_VIDEO_BMP_GZ
ip unsigned char *dst = NULL; ulong len;#endif WATCHDOG_RESET(); if (!((bmp->header.signature[0] == 'B') && (bmp->header.signature[1] == 'M'))) {#ifdef CONFIG_VIDEO_BMP_GZIP /* * Could be a gzipped bmp image, try to decrompress... */ len = CONFIG_SYS_VIDEO_LOGO_MAX_SIZE; dst = malloc(CONFIG_SYS_VIDEO_LOGO_MAX_SIZE); if (dst == NULL) { printf("Error: malloc in gunzip failed!/n"); return 1; } /* * NB: we need to force offset of +2 * See doc/README.displaying-bmps */ if (gunzip(dst+2, CONFIG_SYS_VIDEO_LOGO_MAX_SIZE-2, (uchar *) bmp_image, &len) != 0) { printf("Error: no valid bmp or bmp.gz image at %lx/n", bmp_image); free(dst); return 1; } if (len == CONFIG_SYS_VIDEO_LOGO_MAX_SIZE) { printf("Image could be truncated " "(increase CONFIG_SYS_VIDEO_LOGO_MAX_SIZE)!/n"); } /* * Set addr to decompressed image */ bmp = (bmp_image_t *)(dst+2); if (!((bmp->header.signature[0] == 'B') && (bmp->header.signature[1] == 'M'))) { printf("Error: no valid bmp.gz image at %lx/n", bmp_image); free(dst); return 1; }#else printf("Error: no valid bmp image at %lx/n", bmp_image); return 1;#endif /* CONFIG_VIDEO_BMP_GZIP */ } width = le32_to_cpu(bmp->header.width); height = le32_to_cpu(bmp->header.height); bpp = le16_to_cpu(bmp->header.bit_count); colors = le32_to_cpu(bmp->header.colors_used); compression = le32_to_cpu(bmp->header.compression); debug("Display-bmp: %ld x %ld with %d colors/n", width, height, colors); if (compression != BMP_BI_RGB#ifdef CONFIG_VIDEO_BMP_RLE8 && compression != BMP_BI_RLE8#endif ) { printf("Error: compression type %ld not supported/n", compression);#ifdef CONFIG_VIDEO_BMP_GZIP if (dst) free(dst);#endif return 1; } padded_line = (((width * bpp + 7) / 8) + 3) & ~0x3;#ifdef CONFIG_SPLASH_SCREEN_ALIGN if (x == BMP_ALIGN_CENTER){ x = max(0, (int)(VIDEO_HDMI_VISIBLE_COLS - width) / 2); printf("VVVVVVVVx=%d",x); } else if (x < 0) x = max(0, (int)(VIDEO_HDMI_VISIBLE_COLS - width + x + 1)); if (y == BMP_ALIGN_CENTER) y = max(0, (int)(VIDEO_HDMI_VISIBLE_ROWS - height) / 2); else if (y < 0) y = max(0, (int)(VIDEO_HDMI_VISIBLE_ROWS - height + y + 1));#endif /* CONFIG_SPLASH_SCREEN_ALIGN */ /* * Just ignore elements which are completely beyond screen * dimensions. */ if ((x >= VIDEO_HDMI_VISIBLE_COLS) || (y >= VIDEO_HDMI_VISIBLE_ROWS)) return 0; if ((x + width) > VIDEO_HDMI_VISIBLE_COLS) width = VIDEO_HDMI_VISIBLE_COLS - x; if ((y + height) > VIDEO_HDMI_VISIBLE_ROWS) height = VIDEO_HDMI_VISIBLE_ROWS - y; bmap = (uchar *) bmp + le32_to_cpu(bmp->header.data_offset); fb = (uchar *) (video_hdmi_fb_address + ((y + height - 1) * VIDEO_HDMI_VISIBLE_COLS * VIDEO_HDMI_PIXEL_SIZE) + x * VIDEO_HDMI_PIXEL_SIZE); /* We handle only 4, 8, or 24 bpp bitmaps */ switch (le16_to_cpu(bmp->header.bit_count)) { case 24: padded_line -= 3 * width; ycount = height; //printf("xiessh----VIDEO_DATA_FORMAT = %d/n",VIDEO_HDMI_DATA_FORMAT); switch (VIDEO_HDMI_DATA_FORMAT) { case GDF_32BIT_X888RGB: while (ycount--) { WATCHDOG_RESET(); xcount = width; while (xcount--) { FILL_32BIT_X888RGB(bmap[2], bmap[1], bmap[0]); bmap += 3; } bmap += padded_line; fb -= (VIDEO_HDMI_VISIBLE_COLS + width) * VIDEO_PIXEL_SIZE; } break; default: printf("Error: 24 bits/pixel bitmap incompatible " "with current video mode/n"); break; } break; default: printf("Error: %d bit/pixel bitmaps not supported by U-Boot/n", le16_to_cpu(bmp->header.bit_count)); break; }#ifdef CONFIG_VIDEO_BMP_GZIP if (dst) { free(dst); }#endif if (cfb_do_flush_cache) flush_cache(VIDEO_FB_ADRS, VIDEO_SIZE); return (0);}

實現了上面的內容之后,接下來需要在uboot的fb中做好映射,主要是將fb0對應的logo的資源送到lcd、fb1對應的logo資源送到hdmi顯示,具體的代碼和平臺相關。

這樣造成的影響是會使uboot階段顯示的內存增加一倍,之前只用了一個圖片,現在用到了兩個圖片,所以內存會增加一倍。

當android系統起來的時候,因為lcd是豎屏,lcd上面的內容旋轉了90度當成了橫屏模式在使用,hdmi是橫屏,會造成android動畫的前半段在hdmi上面顯示的android字樣變成了垂直顯示,知道android的display的java服務啟動之后,android的顯示系統識別到了hdmi設備,系統才顯示正常。

對于這種情況,hdmi的前半段的異常顯示,由于硬件無法rotation,只能采取一個規避的方式解決,將開機啟動的logo一直保存到android上層的顯示系統識別到hdmi后,才釋放boot logo的資源,在這個之前,一直都顯示logo的圖片。具體的實現方式和平臺相關,代碼就不貼了。


上一篇:隱藏狀態欄

下一篇:撤回提交記錄

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久久亚洲精选| 久久69精品久久久久久久电影好| 亚洲成成品网站| 久久av红桃一区二区小说| 成人精品在线视频| 欧美性猛交xxxx黑人| 国产精品美女免费| 亚洲国产精品va在线看黑人动漫| 国产91精品久久久久久久| 欧美亚洲另类制服自拍| 久久久www成人免费精品| 日韩欧美国产视频| 精品亚洲一区二区三区在线观看| 2019中文字幕在线免费观看| 国产日韩在线播放| 国产精品网红福利| 97久久精品国产| 欧美成人精品一区二区三区| 亚洲性xxxx| 欧美成人免费小视频| 欧美黄色三级网站| 国产91ⅴ在线精品免费观看| 日韩av综合网站| 欧美性猛交xxx| 日韩精品在线观看视频| 岛国av一区二区在线在线观看| 日韩av一区二区在线| 久久夜色撩人精品| 亚洲国产精品久久久久| 国产亚洲精品美女久久久| 欧日韩在线观看| 欧美激情手机在线视频| 国产精品久久久久av| 国产精品久久中文| 亚洲欧美在线免费观看| 国产日韩欧美视频在线| 亚洲黄色免费三级| 91禁国产网站| 欧美一级大胆视频| 777777777亚洲妇女| 69久久夜色精品国产69乱青草| 色阁综合伊人av| xvideos成人免费中文版| 欧美日本中文字幕| 国产成人亚洲综合91| 激情成人在线视频| 久久视频免费在线播放| 国产精品极品美女在线观看免费| 亚洲欧美一区二区三区情侣bbw| 国产一区二区三区久久精品| 国产日韩欧美日韩大片| 日韩欧美国产高清91| 国产成人精品视| 亚洲系列中文字幕| 亚洲女性裸体视频| 91精品久久久久久久久久久久久久| 欧美激情按摩在线| 久久久久国产精品免费| 国产精品久久视频| 国产午夜一区二区| 98精品国产自产在线观看| 欧美在线一级va免费观看| 久操成人在线视频| 国产精品美女午夜av| 日韩在线播放一区| 国产成人avxxxxx在线看| 欧美日韩国产成人高清视频| 欧美激情女人20p| 欧美国产亚洲视频| 久久久天堂国产精品女人| 97av视频在线| 欧美激情视频在线| 久久精彩免费视频| 成人免费自拍视频| 欧美激情亚洲国产| 国产成+人+综合+亚洲欧美丁香花| 成人免费观看49www在线观看| 青青青国产精品一区二区| 欧美一级大片在线观看| 国产日韩欧美另类| 日韩欧美a级成人黄色| 91久久久久久久久| 亚洲精品456在线播放狼人| 日韩中文字幕在线视频| 91av在线影院| 91亚洲国产成人精品性色| 国产成人精彩在线视频九色| 97香蕉超级碰碰久久免费的优势| 久久久av一区| 亚洲人成电影网站色| 日韩福利在线播放| 日本午夜精品理论片a级appf发布| 91在线观看免费高清| 成人av在线天堂| 欧美在线观看网址综合| 欧美性受xxxx白人性爽| 欧美一级免费视频| 日韩一级黄色av| 亚洲视频日韩精品| 午夜精品一区二区三区在线| 最近更新的2019中文字幕| 91在线视频精品| 日韩中文视频免费在线观看| 日韩高清电影免费观看完整| 狠狠躁夜夜躁久久躁别揉| 日韩欧美国产免费播放| 亚洲综合自拍一区| 91亚洲精品在线观看| 久久手机免费视频| 亚洲综合色av| 中文字幕亚洲欧美日韩高清| 欧美午夜xxx| 欧美性精品220| 亚洲综合精品一区二区| 亚洲精品国产美女| 亚洲国内精品在线| 国产日韩精品综合网站| 91在线观看免费网站| 久久精品欧美视频| 色综合色综合久久综合频道88| 日本久久中文字幕| 国产成+人+综合+亚洲欧美丁香花| 欧美有码在线观看视频| 日韩一区二区在线视频| 成人h片在线播放免费网站| 91po在线观看91精品国产性色| 久久久久久亚洲精品中文字幕| 欧美午夜电影在线| 久久这里有精品| 成人网页在线免费观看| 亚洲一级片在线看| 69av在线视频| 91社区国产高清| 欧美一区在线直播| 性欧美xxxx| 97国产真实伦对白精彩视频8| 国模极品一区二区三区| 亚洲人成网在线播放| 久久精品国产99国产精品澳门| 亚洲自拍偷拍在线| 91久热免费在线视频| 日本欧美一二三区| 精品视频久久久久久久| 日韩视频欧美视频| 中文字幕国产精品久久| 在线日韩精品视频| 91精品国产高清久久久久久| 日本欧美国产在线| 麻豆国产va免费精品高清在线| 久久亚洲精品视频| 亚洲自拍偷拍第一页| 亚洲国产精品一区二区三区| 亚洲片国产一区一级在线观看| 国产精品美女免费视频| 国内精品久久久久久久| 伊人久久五月天| 欧美日韩国产一区中文午夜| 亚洲成人黄色在线| 欧美噜噜久久久xxx| 亚洲成av人片在线观看香蕉| 在线播放精品一区二区三区| 91爱视频在线| 成人性生交大片免费观看嘿嘿视频| 色妞色视频一区二区三区四区|