PXA310的BSP中没有带开机Logo的功能,所以只能自己添加。但是在网上找资料,找来找去,都是三星的,于是很郁闷的想,怎么当初他们选芯片的时候没选三星的……
没办法,只能硬着头皮上了。对比查找到的资料的介绍,要实现开机Logo的功能,就是要在Eboot中完成。首先需要初始化PXA310芯片的LCD Controller模块,之后根据需要配置LCD模组,然后将图片数据放入指定内存给LCD Controller模块进行刷新即可。折腾了两三天,终于初步搞出来了。记录一下以备查。
实现过程:
1、MenuTest.c文件里有对LCD模块的初始化配置函数 InitLCDC,在main.c的OEMPlatformInit中进行调用;
2、根据使用的LCD模组修改InitLCDC中对相关寄存器的配置参数,如LCCR1,,LCCR2等;
3、将需要显示的图片数据使用DrawBuffer函数写入内存对应的地址供调用;
4、根据需要,对LCD模组进行配置。
实现中遇到的心得:
1、InitLCDC在main.c的OEMPlatformInit中进行调用的位置可能会对启动有影响,这个我还没仔细看之前随便放了一个位置,结果启动失败,后来我是放在Eboot进行菜单选择等待的倒计时前调用的;
2、InitLCDC对模块进行了配置,但是要结合自己所用的LCD模组,根据具体的情况配置LCCR1~LCCR3中的BLW,ELW等显示参数。之前就因为配置错误导致花屏等情况;
3、使用DrawBuffer函数进行显示数据写入内存时,地址要定好,开始时使用了原来代码里使用的 0x802000000地址,显示是显示了,可是在启动中很快就灰屏了,后来发现是同样的地址因为执行镜像调入被覆盖了,数据丢失显示失败。而BSP中之后的LCD驱动中,是使用VirtualAlloc开辟了一块内存进行显示数据的存放的。查看config.bib文件,发现配置中保留了一小块区域给显示,于是使用这块区域,问题解决,config.bib中配置如下:
MEMORY
; Name Staet Size Type
......
DISPLAY 87CFF000 0030100 RESERVED
......
4、根据使用的LCD模块不同,可能需要对其进行参数配置。我是用的时候NEC的3.5"LCD,在使用前,需要通过SPI总线对其内部寄存器进行配置,不然无法正常工作,于是在EBoot中根据其时序对模组进行配置。而有些模组采用默认配置就可以工作,那就可以直接上电使用;
5、LCD的显示数据采用了DMA的方式传输,每次传递32bit,由于显示采用了RGB565的方式,每个pixel的颜色采用16bit的数据表示,于是每次DMA传输的数据是2个pixel的显示内容。这个要注意顺序,高16位代表后一个pixel的信息,低16位代表前一个pixel的内容,调试的时候使用位图转换软件将图片转成数据后,直接调用老是感觉不对,显示错位,就是因为这个传输数据的位置弄反造成的。