我用的飞凌OK6410开发板在烧入系统(Wince6.0系统)后,默认是采用4.3寸触摸屏显示,而我的项目中采用的是HDMI高清显示,因此每次烧完系统后,都要重新用DNW来配置为高清显示驱动,比较麻烦,所以我打算修改一下eboot的程序,使其烧入系统后的默认显示设备为HDMI高清显示。下面主要是阐述一下我的思路和方法。
分析: 之所以默认采用4.3寸触摸屏显示,是因为初始写入Boot Media中的Boot Config中关于显示设备的配置是4.3寸触摸屏。这样每次启动系统时,bootloader会从Boot Media中将配置读出,从而选择相应的显示驱动。那么我们 也就有了两种修改方案了:第一种,在bootloader从Boot Media中读出关于显示配置后,我们将其重新赋值为HDMI显示屏,覆盖原先读出的值;第二种,在下载映像时,我们往Boot Media的配置中写入HDMI显示,这样以后读出的值就是HDMI了。
实现: 上面是我一开始的思路,按照这个思路,我首先实现了第一种方案。可以查看一下Eboot下的main.c文件和blcommon.c文件中的BootloaderMain函数,BootloaderMain()主要依次调用以下几个函数:OEMDebugInit()、OEMPlatformInit()、OEMPreDownload()、OEMLaunch(),查看的目的是找出源码中在哪里将配置信息从Boot Media中读出的。我发现在OEMPlatformInit()函数下,有这样一段调用
这段代码先从Boot Media中读取TOC信息(包含了Boot Config信息),然后调用函数初始化显示功能。进一步查看InitializeDisplay()函数,有一段关于LCD选择的代码,如下
- //select LCD module
- switch(g_pBootCfg->ConfigFlags&LCD_TYPE_MASK){
- case LCD_HUA350_RGB:
- LcdType = LDI_HUA350_RGB;
- g_dwLcdWidth = 320;
- g_dwLcdHeight = 240;
- g_dwLcdBpp = 16;
- break;
- case LCD_HUA430_RGB:
- LcdType = LDI_HUA430_RGB;
- g_dwLcdWidth = 480;
- g_dwLcdHeight = 272;
- g_dwLcdBpp = 16;
- break;
- case LCD_HUA560_RGB:
- LcdType = LDI_HUA560_RGB;
- g_dwLcdWidth = 640;
- g_dwLcdHeight = 480;
- g_dwLcdBpp = 16;
- break;
- case LCD_QUN700_RGB:
- LcdType = LDI_QUN700_RGB;
- g_dwLcdWidth = 800;
- g_dwLcdHeight = 480;
- g_dwLcdBpp = 16;
- break;
- case LCD_VGA800_RGB:
- LcdType = LDI_VGA800_RGB;
- g_dwLcdWidth = 800;
- g_dwLcdHeight = 600;
- g_dwLcdBpp = 16;
- break;
- case LCD_VGA1024_RGB:
- LcdType = LDI_VGA1024_RGB;
- g_dwLcdWidth = 1024;
- g_dwLcdHeight = 768;
- g_dwLcdBpp = 16;
- break;
- default:
- LcdType = LDI_HUA350_RGB;
- g_dwLcdWidth = 320;
- g_dwLcdHeight = 240;
- g_dwLcdBpp = 16;
- break;
- }
- g_pBootCfg->ConfigFlags&=~LCD_TYPE_MASK;
- g_pBootCfg->ConfigFlags|=LCD_VGA1024_RGB;
这里要注意下,不要将LCD_VGA1024_RGB写成LDI_VGA1024_RGB,我一开始就犯了这个错误,直接从代码中拷贝,结果一不小心拷错了,结果找了好久才发现了这个问题,还在飞凌论坛上发了个帖子,不过没有人回复,比较郁闷,好在找到了问题所在。
修改好了之后,重新编译一下bootloader,然后Make Image,这里不用对整个工程进行重新编译的。如下: