一般 uboot 中修改驱动基本都是在 xxx.h 和 xxx.c 这两个文件中进行的,xxx 为板子名称,
比如 mx6ull_hyq_emmc.h 和 mx6ull_hyq_emmc.c 这两个文件.
目录
一般修改 LCD 驱动重点注意以下几点:
①、LCD 所使用的 GPIO,查看 uboot 中 LCD 的 IO 配置是否正确。
②、LCD 背光引脚 GPIO 的配置。
③、LCD 配置参数是否正确。
1.检查LCD的GPIO管脚
检查LCD的GPIO管脚,包括复位、背光的复用功能以及电气属性
LCD管脚初始化,复位LCD,打开背光
2.检查LCD配置参数是否正确
需要注意的是像素时钟pixclock需要转换成皮秒
像素时钟的计算
3.修改环境变量panel
修改mx6ull_hyq_emmc.h文件默认环境变量中的panel为TFT4384,即LCD配置参数中mode.name
LCD的初始化是通过环境变量panel来选择的,如果您有多块不同分辨率的屏幕,那么下图这里可以添加多块屏幕的信息,每块屏幕的mode.name不能相同;如果mode.name和panel的值相同则选中当前屏幕,因此可以在驱动中兼容多块屏幕,通过设置环境变量panel来切换屏幕
struct display_info_t const displays[]是一个全局的变量,.enable = do_enable_parallel_lcd是LCD的硬件初始化函数
如果环境变量panel匹配不成功则会输出 printf("unsupported panel %s\n", panel);
屏幕切换(LCD驱动选择)可通过以下命令来切换:
setenv panel "xxx"
saveenv
reset
4.修改uboot启动logo
在tools下有一个bmp_logo.c文件,bmp_logo这个工具专门是将bmp图片的图片数据提取出来保存到bmp_logo_data.h的unsigned char bmp_logo_bitmap[]数据中,初始化LCD到刷logo的函数调用过程如下
drv_lcd_init()
-->lcd_init()-
- ->lcd_clear()
-->lcd_logo()
-->lcd_logo_plot()-->bmp_logo_bitmap
修改logo,首先tools/logos/文件夹下保存了各种logo的bmp图片
其次是通过tools/下的makefile文件中的LOGO_BMP来选择logos文件夹下的哪一张bmp图片做uboot的默认启动logo
比如现在是选择freescale.bmp这张图片,那么有如下两种方法来修改logo
1.将新的bmp图片来替换tools/logos/文件夹下freescale.bmp
2.将新的bmp图片添加到tools/logos/文件夹下,并修改tools文件夹makefile文件中LOGO_BMP来选择新的bmp图片
注意新的bmp图片尺寸最好和原来的保持一致,并且像素位深不能超过8bit
5.动态加载logo
增加以下宏定义,支持BMP命令
//支持BMP命令
#define CONFIG_CMD_BMP
//支持BMP命令
#define CONFIG_BMP_8BPP
屏蔽以下宏定义,否则会都刷其它logo导致闪屏
在适当的地方加载并显示logo,以下例子logo保存在SD卡中
run_command("fatload mmc 0:1 80800000 logo.bmp", 0 );
run_command("bmp display 80800000 0 0", 0 );
由于logo存在于SD卡或者内部MMC中,我这是在board_late_init函数中调用,确保在mmc设备已初始化之后再加载。
uboot只能加载显示8bit位深的bmp图片,冬天加载优点是灵活修改logo,不需要重新编译Uboot源码,缺点是如果图片过大可能会出现一点点的绘制过程。
6.去掉logo上的启动信息
修改/drivers/video/cfb_console.c注释掉以下代码
7.SPLASH_SCREEN
此方法设置启动logo比前面几种更加灵活、方便快捷
需要用到的宏定义
#define CONFIG_ENV_IS_IN_MMC
#define CONFIG_VIDEO_LOGO
#define CONFIG_SPLASH_SCREEN
环境变量
"splashimage=0x88000000\0" \
"logo_file=logo.bmp\0" \
初始化和刷logo的位置
driver/video/cfb_console.c文件中
static void *video_logo(void)
video_init()
->video_logo()
关键代码如下
#if defined(CONFIG_ENV_IS_IN_MMC)
extern int mmc_get_env_dev(void);
char mmc_part[20] = {0};
sprintf(mmc_part, "%d:%d", mmc_get_env_dev(), 1);
char *argv[5] = {
"fatload", "mmc", mmc_part, s, getenv("logo_file")};
do_fat_fsload(NULL, 0, 5, argv);
#endif
if (s != NULL) {
splash_screen_prepare();
addr = simple_strtoul(s, NULL, 16);
if (video_display_bitmap(addr,
video_logo_xpos,
video_logo_ypos) == 0) {
video_logo_height = 0;
return ((void *) (video_fb_address));
}
}
#endif /* CONFIG_SPLASH_SCREEN */
添加默认环境变量
相关的宏定义