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

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

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

2019-11-09 14:33:27
字體:
來源:轉載
供稿:網友

在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
欧美日韩国产综合视频在线观看中文| 欧美高清在线视频观看不卡| 久久99久久99精品免观看粉嫩| 欧美成年人在线观看| 精品国产鲁一鲁一区二区张丽| 有码中文亚洲精品| 国产成人精品视频在线| 亚洲欧美日韩精品久久| 久久精品影视伊人网| 日韩美女在线看| 成人444kkkk在线观看| 成人中文字幕+乱码+中文字幕| 欧美高清在线视频观看不卡| 精品久久久久久国产| 日韩免费看的电影电视剧大全| 亚洲成人网久久久| 久久久999精品| 成人免费直播live| 日韩精品在线私人| 日韩综合视频在线观看| 成人黄色短视频在线观看| 成人xxxxx| 亚洲天堂网站在线观看视频| 成人综合网网址| 国产精品白丝jk喷水视频一区| 精品日韩视频在线观看| 成人做爽爽免费视频| 色婷婷av一区二区三区在线观看| 国产精品一区二区在线| 亚洲欧美日韩在线一区| 亚洲精品视频免费| 国产精品自拍视频| 亚洲一区二区三区四区视频| 国产免费亚洲高清| 亚洲国产日韩一区| 亚洲欧美日韩一区二区在线| 日韩精品在线播放| 色偷偷亚洲男人天堂| 精品毛片网大全| 奇米一区二区三区四区久久| 国产精品xxxxx| 最近2019中文字幕在线高清| 91av福利视频| 国产91成人在在线播放| 欧美在线亚洲一区| 日本成人免费在线| 久久福利视频网| 精品中文字幕在线2019| 国产一区二中文字幕在线看| 亚洲男人第一av网站| 久久国产精品偷| 久久国产一区二区三区| 久久久国产在线视频| 成人免费福利视频| 日韩欧美中文字幕在线播放| 久久久久久久999| 国产精品69久久| 国产精品揄拍500视频| 国产亚洲精品成人av久久ww| 日韩av在线电影网| 欧美中文字幕视频| 成人淫片在线看| 国产精品日韩在线| 国产精品视频网站| 97在线免费观看视频| 日韩av三级在线观看| 国产精品吊钟奶在线| 日本一区二区三区四区视频| 日韩大片免费观看视频播放| 久久中文字幕视频| 亚洲欧洲xxxx| 在线色欧美三级视频| 92福利视频午夜1000合集在线观看| 日韩国产高清污视频在线观看| 色www亚洲国产张柏芝| 成人精品一区二区三区| 亚洲天堂男人天堂| 欧美在线视频一区| 久久精品最新地址| 欧美综合一区第一页| 亚洲精品久久久一区二区三区| 欧美精品在线免费播放| 精品美女永久免费视频| 国产日韩专区在线| 精品久久久久久久久久ntr影视| 日本三级韩国三级久久| 日韩在线观看av| 久久夜色精品国产| 国产亚洲一区二区精品| 亚洲激情电影中文字幕| 国产美女精品视频免费观看| 国产精品一区二区三| 国产精品扒开腿做爽爽爽男男| 亚洲色图美腿丝袜| 亚洲韩国青草视频| 亚洲精品自拍第一页| 欧美极品第一页| 国产精品视频导航| 欧美孕妇孕交黑巨大网站| 欧美精品成人91久久久久久久| 一区二区三欧美| 国产日韩精品在线播放| 国产精品久久久久久亚洲调教| 欧美亚洲国产日本| 日韩精品极品在线观看| 日韩欧美国产免费播放| 亚洲第一偷拍网| 亚洲国产精品成人va在线观看| 国产精品青青在线观看爽香蕉| 在线观看久久av| 国产免费一区二区三区在线观看| 亚洲国产成人91精品| 亚洲最大福利视频网站| 亚洲人精选亚洲人成在线| 国产一区二区三区视频| 狠狠色香婷婷久久亚洲精品| 国产精品露脸av在线| 日韩专区在线播放| 精品国产区一区二区三区在线观看| 亚洲综合日韩在线| 久久精品国产久精国产一老狼| 欧美xxxx做受欧美| 日韩成人av网址| 久久综合88中文色鬼| 亚洲欧美日韩成人| 日韩精品在线观| 九九久久精品一区| 精品自拍视频在线观看| 在线观看国产精品日韩av| 久久夜色精品国产亚洲aⅴ| 欧美一级淫片播放口| 欧美激情三级免费| 久久久女女女女999久久| 欧美激情综合亚洲一二区| 欧美激情中文字幕在线| 亚洲欧美在线一区二区| 久久久国产精彩视频美女艺术照福利| 欧美性生交大片免网| 日韩在线观看免费高清完整版| 精品少妇v888av| 成人在线观看视频网站| 国产精品久久一区主播| 久久综合色影院| 欧美午夜激情在线| 欧美第一淫aaasss性| 国产视频精品一区二区三区| 欧美精品在线网站| 亚洲天堂开心观看| 日韩国产高清污视频在线观看| 中文字幕欧美日韩在线| 欧美日韩激情网| 国产三级精品网站| 国产亚洲人成a一在线v站| www.精品av.com| 亚洲欧洲在线播放| 欧美中文在线观看国产| 大量国产精品视频| 精品视频在线播放色网色视频| 欧美午夜宅男影院在线观看| 久久人人爽人人爽人人片av高清| 精品综合久久久久久97| 国产aⅴ夜夜欢一区二区三区| 国产精品mp4| 在线亚洲欧美视频|