U-Boot显示logo的办法
发布时间:2021-11-23 13:54:52 所属栏目:PHP教程 来源:互联网
导读:本文使用u-boot2010.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中的std
本文使用u-boot2010.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相关的宏 #define CONFIG_CMD_BMP #define CONFIG_VIDEO #define CONFIG_VIDEO_S3C2410 #define CONFIG_VIDEO_LOGO #define CONFIG_VIDEO_BMP_LOGO #define VIDEO_FB_16BPP_WORD_SWAP 如果定义了VIDEO_LOGO和VIDEO_BMP_LOGO 编译时会执行tools目录下的bmp_logo程序,读取"tools/logos/denx.bmp"文件,在include下生成bmp_logo.h文件 文件内容如下: #define BMP_LOGO_WIDTH 160 #define BMP_LOGO_HEIGHT 96 #define BMP_LOGO_COLORS 31 #define BMP_LOGO_OFFSET 16 unsigned short bmp_logo_palette[] = { ....................... }; unsigned char bmp_logo_bitmap[] = { ....................... }; 显示logo函数就会调用这个数组中的数据,显示到屏上 在cfb_console.c中定义了LOGO的属性 #define VIDEO_LOGO_WIDTH BMP_LOGO_WIDTH #define VIDEO_LOGO_HEIGHT BMP_LOGO_HEIGHT #define VIDEO_LOGO_LUT_OFFSET BMP_LOGO_OFFSET #define VIDEO_LOGO_COLORS BMP_LOGO_COLORS 这个bmp文件是有要求的,位深度必须为8位,大小也有限制(全屏图片肯定是不行的,读取文件的后半部数据都是0) 自己做个logo图片,jpeg格式就可以,使用linux下的图片工具转成8位的bmp文件 jpegtopnm logo.jpg | ppmquant 31 | ppmtobmp -bpp 8 > denx.bmp 也可以搞个脚本,方便转换 #!/bin/sh jpegtopnm $1 | ppmquant 31 | ppmtobmp -bpp 8 > $2 用法:脚本 原始文件名 转换后的文件名 三星平台默认使用denx.bmp文件,把自己的logo改成这个文件名,再编译就行了 一个显卡设备的结构体: static GraphicDevice *pGD; /* Pointer to Graphic array */ GraphicDevice是表示显示设备属性的结构体 pGD代表的就是显示设备 在xc2440_lcd.c驱动中,给pGD赋值 pGD->winSizeX = res_mode->xres; pGD->winSizeY = res_mode->yres; pGD->plnSizeX = res_mode->xres; pGD->plnSizeY = res_mode->yres; pGD->gdfBytesPP = 2; pGD->gdfIndex = GDF_16BIT_565RGB; pGD->frameAdrs = LCD_VIDEO_ADDR; pGD->memSize = VIDEO_MEM_SIZE; 显存的地址:#define LCD_VIDEO_ADDR 0x33d00000 (in xc2440.h) 显存的大小:#define VIDEO_MEM_SIZE 0x200000 (in xc2440_lcd.c) 在cfb_console.c中得到显卡显存的地址: #define VIDEO_FB_ADRS (pGD->frameAdrs) video_fb_address = (void *)VIDEO_FB_ADRS 后面的操作就使用video_fb_address 在logo_plot函数中,显示BMP_LOGO的流程 (dest是指向video_fb_address的) source = bmp_logo_bitmap; logo_red = malloc (BMP_LOGO_COLORS); logo_green = malloc (BMP_LOGO_COLORS); logo_blue = malloc (BMP_LOGO_COLORS); for (i = 0; i < VIDEO_LOGO_COLORS; i++) { logo_red[i] = (bmp_logo_palette[i] & 0x0f00) >> 4; logo_green[i] = (bmp_logo_palette[i] & 0x00f0); logo_blue[i] = (bmp_logo_palette[i] & 0x000f) << 4; } while (ycount--) { xcount = VIDEO_LOGO_WIDTH; while (xcount--) { r = logo_red[*source - VIDEO_LOGO_LUT_OFFSET]; g = logo_green[*source - VIDEO_LOGO_LUT_OFFSET]; b = logo_blue[*source - VIDEO_LOGO_LUT_OFFSET]; *(unsigned short *) dest = SWAP16 ((unsigned short) (((r >> 3) << 11) | ((g >> 2) << 5) | (b >> 3))); } source++; dest += VIDEO_PIXEL_SIZE; } dest += skip; 如果只定义VIDEO_LOGO,没有定义VIDEO_BMP_LOGO 就使用LINUX_LOGO显示,用到include/linux_logo.h中定义的数组,显示的方式也不一样 ![]() (编辑:云计算网_泰州站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |