1 前言

Hi3516可以通过Uboot显示图片,Hi3516的Uboot代码提供功能如下:

  • 提供boot环境下VO设备的开启和关闭,涵盖VO典型接口和时序。
  • 提供boot环境下VO图形层的开启和关闭。
  • 提供boot环境下VO视频层的开启和关闭。
  • 提供boot环境下JPEG硬件解码输出RGB格式图像(仅Hi3559AV100支持),配合VO图形层显示。
  • 提供boot环境下JPEG硬件解码输出YVU SEMI-PLANAR420格式图像,配合VO视频层显示。
  • VO图形层默认显示格式为ARGB1555,视频层默认显示格式为YVU SEMIPLANAR420。

2 制作开机画面

使用PS制作一副1920*1080像素图片,导出格式为jpg。导出时注意不要勾选转换为sRGB!

3 编译内核

准备好画面之后,可以使用内核定时器进行划线,以实现进度条效果。编译内核步骤如下:

(1)从 linux 开源社区下载 v4.9.37 版本的内核

①进入网站: www.kernel.org

②选择 HTTP 协议资源的 https://www.kernel.org/pub/选项,进入子页面

③选择 linux/菜单项, 进入子页面

④选择 kernel/菜单项, 进入子页面

⑤选择 v4.x/菜单项, 进入子页面

⑥下载 linux-4.9.37.tar.gz(或 linux-4.9.37.tar.xz)

(2)打补丁

①将下载的 linux-4.9.37.tar.gz 存放到 osdrv 的 opensource/kernel 目录中

②进入osdrv的根目录,执行如下命令:

1
2
3
4
5
6
7
8
cd opensource/kernel
tar -zxf linux-4.9.37.tar.gz
mv linux-4.9.37 linux-4.9.y
cd linux-4.9.y
patch -p1 < ../linux-4.9.37.patch
cd ../
tar -czf linux-4.9.y.tgz linux-4.9.y
cd ../../

(3)配置内核

①在内核目录下, 拷贝.config 文件:

1
cp arch/arm/configs/hi3516dv300_smp_defconfig .config

②通过“make menuconfig” 进行内核配置:

1
make ARCH=arm CROSS_COMPILE=arm-himix200-linux- menuconfig

③选择需要的模块。

④选择完毕后, 保存并退出。

⑤添加划线代码。

在/osdrv/opensource/kernel/linux-4.9.y/arch/arm/mach-hibvt目录下,新建systimer.c文件(注:以下代码不完整,仅供参考)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
static int __init __system_timer_init(void)
{
int i=0,j=0;
//映射绘图地址
pbase_logo=ioremap_nocache(0x90000000,1920*1080*2);

#if 0
//绘制进度条边框
for(i=480;i<1440;i++){
*((unsigned short*)(pbase_logo)+1920*860+i)=0xe71c;
*((unsigned short*)(pbase_logo)+1920*861+i)=0xe71c;
*((unsigned short*)(pbase_logo)+1920*880+i)=0xe71c;
*((unsigned short*)(pbase_logo)+1920*881+i)=0xe71c;
}

for(j=860;j<881;j++){
*((unsigned short*)(pbase_logo)+480+j*1920)=0xe71c;
*((unsigned short*)(pbase_logo)+481+j*1920)=0xe71c;
*((unsigned short*)(pbase_logo)+1439+j*1920)=0xe71c;
*((unsigned short*)(pbase_logo)+1440+j*1920)=0xe71c;
}
#endif
//开启内核定时器,划线
setup_timer(&s_timer, second_timer_handle, 0);
s_timer.expires = jiffies + 20;
add_timer(&s_timer);
return 0;
}

在该目录的makefile下,添加:

1
obj-y +=systimer.o

⑥编译生成内核:

1
make ARCH=arm CROSS_COMPILE=arm-himix200-linux- uImage -j4

生成的 uImage 在内核目录下的/arch/arm/boot/中。

说明: 如果编译过程中出现错误, 按顺序执行以下命令:

1
2
3
make ARCH=arm CROSS_COMPILE=arm-himixXXX-linux- clean
make ARCH=arm CROSS_COMPILE=arm-himixXXX-linux- menuconfig
make ARCH=arm CROSS_COMPILE=arm-himixXXX-linux- uImage

4 烧录

使用HiTool进行烧录,选择依次选择fastboot、kernel、rootfs以及制作的logo图片,并设置相应的起始地址以及大小,点击烧录按钮进行烧录。

5 设置启动参数

烧录完毕之后,进行串口调试,并设置启动参数如下:

1
2
3
4
setenv bootargs 'mem=128M console=ttyAMA0,115200 root=/dev/mtdblock2 rootfstype=jffs2 rw mtdparts=hi_sfc:1M(boot),4M(kernel),25M(rootfs),1M(logo)'
setenv bootcmd 'sf probe 0;sf read 0x82000000 0x1F00000 0x100000;setenv jpeg_addr 0x82000000;setenv jpeg_size 0x100000;setenv jpeg_emar_buf 0x82200000;
setenv vobuf 0x90000000;decjpg 0;startvo 0 32 10;startvl 0 0x90000000 1920 0 0 1920 1080;sf read 0x96000000 0x100000 0x400000;bootm 0x96000000'
saveenv

其中:

  • sf read 0x82000000 0x1F00000 0x100000为读取logo图片址,将0x1F00000起始的1M大小读入内存中,起始地址可根据HiTool烧写完毕的提示信息获得。
  • jpeg_addr是用于存放JPEG图片原始码流的地址
  • jpeg_size是JPEG图片原始码流大小
  • jpeg_emar_buf是解码JPEG图片过程中使用到的buffer地址
  • vobuf是解码JPEG图片后输出RGB图像的存放地址。
  • decjpg 设置解码格式,0: YVU SEMI-PLANAR 420、1: ARGB1555、2:ARGB8888。
  • startvo 启动VO设备。格式为startvo [设备号 接口类型 时序类型],设备号(Device)、接口类型(Interface type)如下表。
芯片 Device Graphic layer Videolayer Interface type
Hi3516DV300 [0] {0} {0}不支持PIP层显示 32(HDMI), 16384(MIPI_Tx),512(LCD_6BIT),1024(LCD_8BIT),2048(LCD_16BIT),4096(LCD_18BIT),8192(LCD_24BIT)

时序类型如下图:

  • startvl 启动视频层。参数:视频层号,图像地址(解码后),行宽,显示位置和大小(x,y,w,h)
  • sf read 0x96000000 0x100000 0x400000;bootm 0x96000000为读取内核。

设置完毕后,即可启动,并显示开机画面。