转:http://blog.chinaunix.net/uid-22030783-id-3257554.html

本文使用uboot2010.03版本,2010.06版本同样适用,在XC2440板上实现显示bmp logo
 
首先需要有LCD的驱动支持,XC2440板的LCD驱动是:drivers/video/xc2440_lcd.c
 
显示LOGO的函数调用流程:
在arch/arm/lib/board.c中的start_armboot调用common/stdio.c中的stdio_init
如果定义了CONFIG_VIDEO和CONFIG_CFB_CONSOLE,调用drivers/video/cfb_console.c中的drv_video_init
video_init调用XC2440的LCD驱动中的video_hw_init
接着video_logo调用logo_plot显示logo
 
在config头文件中(xc2440.h)定义和LCD LOGO相关的宏

  1. #define CONFIG_CMD_BMP
  2. #define CONFIG_VIDEO
  3. #define CONFIG_VIDEO_S3C2410
  4. #define CONFIG_VIDEO_LOGO
  5. #define CONFIG_VIDEO_BMP_LOGO
  6. #define VIDEO_FB_16BPP_WORD_SWAP
如果定义了VIDEO_LOGO和VIDEO_BMP_LOGO
编译时会执行tools目录下的bmp_logo程序,读取"tools/logos/denx.bmp"文件,在include下生成bmp_logo.h文件
 
文件内容如下:

  1. #define BMP_LOGO_WIDTH        160
  2. #define BMP_LOGO_HEIGHT        96
  3. #define BMP_LOGO_COLORS        31
  4. #define BMP_LOGO_OFFSET        16
  5. unsigned short bmp_logo_palette[] = {
  6. .......................
  7. };
  8. unsigned char bmp_logo_bitmap[] = {
  9. .......................
  10. };
显示logo函数就会调用这个数组中的数据,显示到屏上
 
在cfb_console.c中定义了LOGO的属性

  1. #define VIDEO_LOGO_WIDTH    BMP_LOGO_WIDTH
  2. #define VIDEO_LOGO_HEIGHT    BMP_LOGO_HEIGHT
  3. #define VIDEO_LOGO_LUT_OFFSET    BMP_LOGO_OFFSET
  4. #define VIDEO_LOGO_COLORS    BMP_LOGO_COLORS
这个bmp文件是有要求的,位深度必须为8位,大小也有限制(全屏图片肯定是不行的,读取文件的后半部数据都是0)
自己做个logo图片,jpeg格式就可以,使用linux下的图片工具转成8位的bmp文件

  1. jpegtopnm logo.jpg | ppmquant 31 | ppmtobmp -bpp 8 > denx.bmp

也可以搞个脚本,方便转换

  1. #!/bin/sh
  2. jpegtopnm $1 | ppmquant 31 | ppmtobmp -bpp 8 > $2
用法:脚本 原始文件名 转换后的文件名
 
三星平台默认使用denx.bmp文件,把自己的logo改成这个文件名,再编译就行了
 
一个显卡设备的结构体:
static GraphicDevice *pGD;/* Pointer to Graphic array */
 
GraphicDevice是表示显示设备属性的结构体
pGD代表的就是显示设备
 
在xc2440_lcd.c驱动中,给pGD赋值

  1. pGD->winSizeX = res_mode->xres;
  2. pGD->winSizeY = res_mode->yres;
  3. pGD->plnSizeX = res_mode->xres;
  4. pGD->plnSizeY = res_mode->yres;
  5. pGD->gdfBytesPP = 2;
  6. pGD->gdfIndex = GDF_16BIT_565RGB;
  7. pGD->frameAdrs = LCD_VIDEO_ADDR;
  8. pGD->memSize = VIDEO_MEM_SIZE;
显存的地址:#define LCD_VIDEO_ADDR0x33d00000  (in xc2440.h)
显存的大小:#define VIDEO_MEM_SIZE  0x200000     (in xc2440_lcd.c)
 
在cfb_console.c中得到显卡显存的地址:
  1. #define VIDEO_FB_ADRS        (pGD->frameAdrs)
  2. video_fb_address = (void *)VIDEO_FB_ADRS

后面的操作就使用video_fb_address

 
在logo_plot函数中,显示BMP_LOGO的流程
(dest是指向video_fb_address的)

  1. source = bmp_logo_bitmap;
  2. logo_red = malloc (BMP_LOGO_COLORS);
  3. logo_green = malloc (BMP_LOGO_COLORS);
  4. logo_blue = malloc (BMP_LOGO_COLORS);
  5. for (i = 0; i < VIDEO_LOGO_COLORS; i++) {
  6. logo_red[i] = (bmp_logo_palette[i] & 0x0f00) >> 4;
  7. logo_green[i] = (bmp_logo_palette[i] & 0x00f0);
  8. logo_blue[i] = (bmp_logo_palette[i] & 0x000f) << 4;
  9. }
  10. while (ycount--) {
  11. xcount = VIDEO_LOGO_WIDTH;
  12. while (xcount--) {
  13. r = logo_red[*source - VIDEO_LOGO_LUT_OFFSET];
  14. g = logo_green[*source - VIDEO_LOGO_LUT_OFFSET];
  15. b = logo_blue[*source - VIDEO_LOGO_LUT_OFFSET];
  16. *(unsigned short *) dest = SWAP16 ((unsigned short) (((r >> 3) << 11) | ((g >> 2) << 5) | (b >> 3)));
  17. }
  18. source++;
  19. dest += VIDEO_PIXEL_SIZE;
  20. }
  21. dest += skip;
如果只定义VIDEO_LOGO,没有定义VIDEO_BMP_LOGO
就使用LINUX_LOGO显示,用到include/linux_logo.h中定义的数组,显示的方式也不一样
 

uboot显示logo的方式的更多相关文章

  1. 从U-Boot显示Logo到Android

    /******************************************************************************* * 从U-Boot显示Logo到And ...

  2. uboot显示logo的时候发现颜色偏黄【学习笔记】

    平台信息:内核:linux3.0.68 系统:android6.0平台:rk3288 将一张图片烧录进logo分区,发现在uboot读取这张图片并显示的时候发现颜色偏黄,解决办法,在烧录bmp图片的时 ...

  3. mipi屏在内核可以显示logo但是u-boot无法显示的问题【转】

    本文转载自:http://blog.csdn.net/fulinus/article/details/45071721 平台:瑞芯的rk3288 u-boot版本:u-boot-2014.10 ker ...

  4. ArcGIS API for Silverlight 地图元素点闪烁,线流动显示的处理方式

    原文:ArcGIS API for Silverlight 地图元素点闪烁,线流动显示的处理方式 <Grid x:Name="LayoutRoot" Background=& ...

  5. 内核启动后,lcd显示logo失败

    针对-s5pv210,但对其他平台也使用 lcd显示logo失败,若显示成功默认的logo是一只企鹅,但是串口打印“Start display and show logo”,但是LCD屏没有显示    ...

  6. jmeter-Charles抓包显示的请求方式错误了,难道

    抓包显示的请求方式为get,但是get一直报错见上图 将get修改为post就正确了

  7. uboot之logo显示【转】

    本文转载自:http://blog.csdn.net/tuwenqi2013/article/details/60583735 版权声明:本文为博主原创文章,博主欢迎各位转载. 一.logo的调用流程 ...

  8. [uboot]uboot中显示logo

    http://blog.chinaunix.net/uid-20543672-id-3246292.html

  9. [RK3288][Android6.0] 关于uboot中logo相关知识点小结【转】

    本文转载自:http://blog.csdn.net/kris_fei/article/details/76256224 Platform: Rockchip OS: Android 6.0 Kern ...

随机推荐

  1. Oracle with重用子查询

    --with 重用子查询对于多次使用相同子查询的复杂查询语句来说,用户可能会将查询语句分成两条语句执行.第一条语句将子查询结果存放到临时表,第二条查询语句使用临时表处理数据.从 Oracle 9i 开 ...

  2. c json实战引擎五 , 优化重构

    引言 scjson是一个小巧的纯c跨平台小巧引擎. 适用于替换老的cJSON引擎的场景. 数据结构和代码布局做了大量改进.优势体现在以下几个方面: 1) 跨平台 (window 10 + VS2017 ...

  3. Commons CLI 学习(1)

    The Apache Commons CLI library provides an API for parsing command line options passed to programs. ...

  4. memcached安装+绑定访问ip

    安装: 1.由于memcached是基于libevent的,需要安装libevent,libevent-devel $yum -y install libevent libevent-devel 2. ...

  5. 微信小程序 - 时间进度条功能

    关于答题类,或者一些游戏环节的小程序需要用到时间进度条,改功能怎么实现看下面源码 <view class='out' style='margin-top:10px'> <view c ...

  6. react生命周期函数使用箭头函数,导致mobx-react问题

    最近新人加入了项目,遇到了一个很奇怪的问题.mobx observable 属性,onChange的时候就是页面不会刷新. 试来试去,就是不知道什么原因,后来其他同事查到是因为componentWil ...

  7. 前端读者 | Web App开发入门

    本文来自互联网 自Iphone和Android这两个牛逼的手机操作系统发布以来,在互联网界从此就多了一个新的名词 - Web App(意为基于WEB形式的应用程序).业界关于Web App与Nativ ...

  8. es6中对象的一些操坐

    变量的赋值 key值得构建 对象的严格检测 对象的合并 1.变量的赋值: let name='宋宇',age='17岁': let obj={name,age} //快速的将变量引入到对象中去. 2. ...

  9. 8种json数据查询方式

    你有没有对“在复杂的JSON数据结构中查找匹配内容”而烦恼.这里有8种不同的方式可以做到: JsonSQL JsonSQL实现了使用SQL select语句在json数据结构中查询的功能. 例子: ? ...

  10. ARK登录信息

    101,389B,382:仙境353:中心岛380:畸变404:孤岛371:焦土487:灭绝 eaglexmw:389b[65493013] : 初级畸变,高级飞升,TEK全解(有380权限),黑鬼, ...