BOOT LOGO以及显示参数使用参考
1. 概述¶
本文提供了在SDK编译环境中添加、删除、修改Boot logo的方法。
更改logo前需要注意:
-
目前bootlogo只支持jpg图片格式,因为是软件解码,所以图片太大会导致解码速度变慢,导致出图慢。公版默认分配的bootlogo buffer为1M,图片的分辨率需要满足width*height*1.5\<1M;图片大小需要小于logo分区的大小128KB
-
图片的宽需要16对齐
2. BOOT LOGO显示原理¶
在Uboot中已经实现了一套解码JPG、显示的驱动,使用时通过bootcm去显示BOOT LOGO。
BOOT LOGO显示步骤如下:
-
从固定的LOGO分区中抓取屏参或者HDMI/VGA的显示相关信息、原始的JPEG data。
-
显示相关信息保存了多个屏参数据,uboot会根据当前的env中的命名找到所对应的屏参数据。
-
原始的JPGE data也支持多个,根据用户参数可以动态切换所要显示的JPGE。
-
显示信息中还提供了uboot用于显示的buffer地址以及屏幕分辨率和显示刷新率。
-
把JPEG RAW data送进解码器解码。
-
有两种方法可以把解码器解出的数据用于显示,其一是解出YUV420数据用于DISP的显示,显示内容在video层,其二是解出ARGB8888格式送给GOP,显示的内容在图形层。
-
初始化HDMI、Panel,显示BOOT LOGO。
图2-1
3. MISC与LOGO分区¶
Logo支持两种分区格式:
-
LOGO分区
围绕LOGO分区有相关的配置和分区制作的方法,详细介绍参见LOGO分区制作。
-
MISC分区
MISC分区使用的是开源的littlefs文件系统,此文件系统支持读写,比较容易跨平台移植,rtk、uboot和linux中都有支持,并且读取速度非常快,支持掉电保护以及有不错的写均衡机制,因此利用此文件系统可以替代原来的LOGO分区。屏参文件和图片jpeg文件可以做到在uboot、linux、rtk共享一套配置,相对于LOGO分区,使用MISC分区对于使用者来说更加方便对屏参进行修改。
在misc分区中,替代屏参数据的是INI脚本,在uboot中也集成了一套INI parser的代码,用于屏参数据解析,将来也可以扩展成其他功能配置的INI解析。
屏参的基本配置都在INI中,这份INI与LINUX共用,因此对于客户端,只需维护一套屏参。
下表列出LOGO分区与MISC分区的特性。
LOGO分区 | MISC分区 | |
---|---|---|
动态支持屏参变更 | 支持 | 支持 |
屏参参数动态修改 | 不支持 | 支持 |
开机logo图片动态修改 | 不支持 | 支持 |
屏参数据解析时间(估算) | 55ms | 59ms |
是否与LINUX共用屏参 | 否 | 是 |
支持在Linux上mount | 不支持 | 支持 |
分区大小(spinand) | 384KB | 384KB |
MISC分区的littlefs使用的Block size为32KB,因此对于nor flash,在MISC分区中不宜添加多个文件,特别是多个很小的INI配置脚本,若遇到这种情况,请考虑把所有的配置都集中写到一个ini配置脚本中。
Uboot的在开机logo阶段首先会先读取当前的MTD part中是否存在带”misc”、”logo”字段的分区,若存在misc分区,则会读取misc分区中的屏参信息进行点屏和显示logo的动作,否则则会读取LOGO分区中的相关信息。
4. BOOT LOGO相关配置¶
4.1. Enable bootlogo hdmi¶
-
Uboot:
打开如下config:
CONFIG_CMD_BOOTLOGO CONFIG_SSTAR_DISP CONFIG_SSTAR_DISP_HDMITX_VGA CONFIG_SSTAR_HDMITX CONFIG_SSTAR_JPD
注意:如果有用到
hdmi,kernel
的CONFIG_ANALOG_PD_HDMI_ATOP
需要关闭,不然kernel起来开机logo会消失
4.2. Enable bootlogo panel¶
-
Uboot:
打开如下config:
CONFIG_CMD_BOOTLOGO CONFIG_SSTAR_DISP CONFIG_SSTAR_PNL CONFIG_SSTAR_JPD
4.3. Enable MISC partition & INI Parser(暂不支持)¶
-
Uboot:
打开如下config:
CONFIG_FS_LITTLEFS=y CONFIG_SSTAR_INI_PARSER=y
-
Kernel:
Build in fuse.
图4-1
5. LOGO分区制作¶
5.1. LOGO分区基本结构¶
图5-1
LOGO分区分为Partition的header和若干个sub header。
Partition header中保存了sub header的计数以及Tittle。
目前Sub header有两种数据,其一种是保存了屏参以及HDMI/VGA显示参数的数据,这些数据是以C语言结构体的形式保存在Flash中,另外一种是若干个Sub header保存的是Jpeg的图片。
在显示数据中,字段 Frist_use_offset是用于索引当前默认使用的屏参或者hdmi/vpa的设定。
5.2. Project的开机LOGO配置(LOGO 分区)¶
BOOT LOGO的基本修改是基于LOGO分区已经创建,同时显示设备(display out: panel/HDMI/VGA)已经配置完成,在此基础上可以修改LOGO分区中指定的优先使用的显示设备,用于显示的内存地址,以及开机LOGO的文件名。
-
打开build config文件修改三个字段:
BOOTLOGO_FILE = sigmastar1024_600.jpg BOOTLOGO_ADDR = E_LX_FB DISP_OUT_NAME = SAT070CP50
-
BOOTLOGO_FILE 表示在project\board\ini\misc\下使用对应的文件名用于logo显示。
-
BOOTLOGO_ADDR用于显示用的内存地址。
-
DISP_OUT_NAME 显示使用的输出name,如何制定可以参考LOGO分区制作。
5.3. LOGO分区制作源码及工具使用¶
LOGO的RAW data分区生成的源码路径在:
project\image\makefiletools\src\rawgenerator。
在此路径下执行make,会自动把可执行的bin copy到project\image\makefiletools\bin\
用于在编译阶段生成对应的LOGO image。
LOGO分区生成的脚本:
project\image\image.mk
图5-2
LOGO的image由dispcfggen和logogen两个工具生成,dispcfggen用于产生显示相关的参数数据,logogen生成由图片组成的LOGO数据。
显示数据部分生成的代码路径:
project\image\makefiletools\src\rawgenerator\disp_data_main.c
Jpeg图片数据生成的代码路径:
project\image\makefiletools\src\rawgenerator\logo_data_main.c
使用参数说明:
dispcfggen:
-c 创建一个Raw data的header,并添加显示的sub header和数据,若-o指定的文件存在,则清空文件。
-a 在已经有Raw data header和相关数据的文件末尾追加一个显示相关的sub header以及数据。
-o 指定输出的文件。
-p 板子上用于显示的物理地址
-s 显示地址的内存大小
-d 显示输出的索引名
logogen:
-c 创建一个Raw data的header,并添加jpeg文件的sub header和数据,若-o指定的文件存在,则清空文件。
-a 在已经有Raw data header和相关数据的文件末尾追加一个jpeg文件的sub header以及数据。
-o 指定输出的文件。
-i jpeg 文件的路径。
5.4. 修改显示数据¶
显示数据分成两部分,一部分是屏参,用于panel显示,另外一部分是HDMI/VGA显示输出,这两种属性在使用上是互斥的,用户一旦设定了DISP_OUT_NAME为屏参的名字则输出的显示数据中都是屏参数据,否则若设定的是以HDMI/VGA开头的名字,则只会输出HDMI/VGA的参数数据,例如指定HDMI_1080P60。
5.4.1. 屏参修改¶
-
屏参文件可以向FAE获取,或者自己根据相关文档进行配置。
-
屏参文件是一个已经初始化好的结构体数据,存放在一个h文件中,
project\image\makefiletools\src\rawgenerator\pnl
中存放了公版所有用到的屏参文件,请注意,每个屏参的头文件中声明的数据结构名字和一些define不得重复,否则会编译失败。 -
在文件
disp_data_main.c
中修改或者添加stTable,分别指定屏参名字,屏参数据结构以及mipi 命令数 据结构。特别注意,对于ttl的屏没有mipi参数,因此在mipi那一栏填NULL。图5-3
-
屏参include:
图5-4
-
以上修改完成后重新编译生成执行文件,用执行文件生成LOGO的image中就有添加的屏参,在屏参生成的参数中用
-d
指定优先使用的屏参的名字,若优先使用的屏参不是正确的屏参,在uboot还可以通过修改env
来改变屏参,改动方法参考“多屏参多logo切换”。
5.4.2. HDMI/VGA设定修改¶
-
HDMI、VGA的参数设定没有屏参那么复杂,只需要填写输出timing的宽高和clock。
-
修改方式如下:
图5-5
5.5. 多显示参数切换¶
LOGO的分区中保存了所有的显示参数数据,目前可以通过env来切换不同的显示参数。
使用uboot的env ${dispout}当中显示设置的索引,默认情况下此env为空,在第一次上电起来后若在uboot阶段执行了bootlogo命令,则会把当前使用的设定对应的名字保存到${dispout}。
‘bootlogo’命令执行流程图:
图5-6
通过以上流程图可知,在未指定环境变量${dispout}的情况下,系统会默认设定优先使用的显示参数,在${dispout}与优先使用的显示参数发生不一致的情况,系统则会自动按照${dispout}设定的值去索引对应的显示参数,若找到则回写到flash中,这样下次开机的流程就按照与环境变量匹配的流程执行。
6. MISC分区制作与配置¶
6.1. MISC分区制作¶
MISC分区的文件系统是littlefs,littlefs的打包和linux端自动mount分区都已经在ALKAID的打包脚本中集成好了,如何添加一个MISC分区,请参考分区介绍,这里简单地把一些配置列出来。
根据分区文档中的介绍,若要添加一个MISC分区,需要在project\image\configs\$(chip)
中修改相应的xxx.config
文件。
举例:
-
添加分区的基本配置
misc$(RESOUCE) = $(OUTPUTDIR)/misc misc$(FSTYPE) = lfs misc$(PATSIZE) = 0x60000 misc$(MOUNTPT) = /dev/mtdblock8 misc$(MOUNTTG) = /misc misc$(MTDPART) = $(misc$(PATSIZE))(misc) misc$(OTABLK) = /dev/mtdblock8
由于littlefs已经得到了ALKAID打包脚本的支持,因此在这里misc$(FSTYPE)填成lfs后就可以自动打包成lfs的image包了。
-
添加mount节点列表
USR_MOUNT_BLOCKS:=miservice customer appconfigs misc
-
添加image列表
IMAGE_LIST = cis ipl ipl_cust uboot misc kernel rootfs miservice customer appconfigs
-
添加OTA列表(如必要)
OTA_IMAGE_LIST = ipl ipl_cust uboot misc kernel miservice customer appconfigs
-
在
misc.mk
或者rootfs.mk
中添加文件拷贝命令mkdir -p $(OUTPUTDIR)/misc; mkdir -p $(OUTPUTDIR)/rootfs/misc; cp -rf $(PROJ_ROOT)/board/ini/misc/sigmastar1024_600.jpg $(OUTPUTDIR)/misc/; cp -rf $(PROJ_ROOT)/board/ini/misc/upgrade.jpg $(OUTPUTDIR)/misc/; cp -rf $(PROJ_ROOT)/board/ini/misc/config.ini $(OUTPUTDIR)/misc/;
6.2. INI文件中LOGO相关配置¶
关于屏参和logo显示相关的配置都集成在了/misc/config.ini
中,ini文件可以在linux起来后在路径/misc/下手动修改,也可以重新打包一个misc分区,对分区重新烧写。对ini中相关的logo参数的修改就可以起到切换不同屏参,显示不同logo的效果,具体做法如下。
所有对LOGO显示配置的修改都集中在INI的"LOGO"的section中:
[LOGO] m_eDeviceType = 1; #0 None, 1 LCD, 2 HDMI, 3 VGA m_sParaTarget = ST7710S m_wDispWidth = 0 m_wDispHeight = 0 m_wDispFps = 0 m_sLogoFile0 = sigmastar1024_600.jpg m_sLogoFile1 = upgrade.jpg
表示需要显示LOGO的设备类型。
-
m_sParaTarget:
显示的屏参section索引,只有LOGO设备类型为LCD时才会生效。
-
m_wDispWidth,m_wDispHeight,m_wDispFps:
当显示设备为非LCD类型时,这些参数才有意义,表示的是HDMI/VGA输出的timming。
-
m_sLogoFile0,m_sLogoFile1
LOGO的id所对应的jpeg文件。
INI文件修改完成后重启生效。
7. UBoot命令¶
7.1. Uboot里的bootlogo命令介绍¶
在Uboot中执行bootlogo [logo index] [aspect ratio] [x] [y],此命令会带四个参数分别表示:
-
LOGO中打包的JPEG的数字索引。
-
显示logo的aspect ratio,0表示zoom,全屏显示,1表示center,居中显示,2表示user,用户设定起始点,点对点显示。
-
若aspect ratio为user, x、y表示图片显示的起始点。
7.2. LOGO旋转显示¶
在uboot中修改env ‘logo_rot’,修改完之后重启,或者再次执行bootlogo命令。
logo_rot = 0 表示不旋转
logo_rot = 1 顺时针旋转90°
logo_rot = 2 顺时针旋转180°
logo_rot = 3 顺时针旋转 270°
LOGO旋转后画面左上角仍然从显示的(0, 0)坐标开始显示,其图片的宽和高有可能发生调换,请注意旋转后的图片都必须在显示的区域内,否则显示驱动会报错。
8. sd/usb升级UI显示¶
在uboot中需要打开 SSTAR UPGRADE UI,此命令依赖于SSTAR RGN 、SSTAR DISP。
图8-1
SD卡和USB升级的UI由一张背景图片和一个进度条组成。
UI背景图片依赖于bootlogo命令,boologo显示第二张图片作为升级的UI。
目前使用的图片在:
project\board\ini\misc\upgrade.jpg
图片+进度条显示效果:
图8-2
9. Linux使用屏参¶
Linux代码中通过读取LOGO分区的数据可以获取当前的屏参,在应用端无需再维护多个屏参的头文件,这样可以增加代码的通用性,目前从flash中获取屏参的接口还未开放出来。
若使用的是MISC分区,屏参文件和jpg图片会自动mount到/misc目录下,应用可以参考Panel文档中的介绍如何使用屏参ini文件。