Hi3559 sdk文件结构分析一

sdk自带两种参考设计代码,一个是dv,另一个是dashcam即运动相机,两个的代码组织结构差不多,以dv为例,编译后的烧写固件存放路径为当前reference文件下的out/(chip)_(sensor)/burn/fastboot_(flash),例如hi3559平台imx385 sensor使用spi nor flash存储的固件位于out/hi3559_imx385/burn/fastboot_spinor下面。值得注意的是burn_readme.txt中的固件烧写地址和相关描述跟实际固件布局不符,建议以out/(chip)_(sensor)/burn/fastboot_(flash)/config内容为参考。

由此我们知道有两个文件系统镜像,以spi nor存储为例,rootfs.squashfs和privatefs.jffs2,很显然前者是存放不可修改的系统相关文件和应用程序,后者是可读写的配置参数及其他文件。接下来我们很想知道最终生成的文件系统镜像是从哪里来的,通过product/hi3559/rootfs/Makefile可以看到,rootfs答案分两种情况:
1、没有配置了fastboot启动模式,则来自product/hi3559/rootfs/rootfs。
2、配置fastboot启动模式,则来自product/hi3559/rootfs/minirootfs,其中在打包之前还有将product/hi3559/rootfs/mini_rootfs_priv下所有内容拷贝到前者下面的操作。
上面两种情况的最后,还会将product/hi3559/rootfs/rootfs_priv下所有内容也拷贝到各自的文件系统系统文件夹下。对于不同的参考设计,还有特定的文件系统定制动作,详情可以看rootfs_prepare目标。

通过rootfs_prepare目标还可以看到,上面两种情况下的文件夹最开始都来自于/osdrv/pub/linux下面两个压缩文件(minirootfs.tgz和rootfs.tgz),它们经过解压到现在路径后还加入了一些删减操作以及拷贝参考设计相关编译结果拷贝进去的动作,说白了就是再标准文件系统基础上加入参考设计相关的文件。

privatefs的文件夹则来源于product/hi3559/rootfs/privatefs,这个文件夹很简单只有一个null空文件,这个文件夹实际上也是编译时用脚本生成的,看一看privatefs_prepare目标就知道了,用户可以在这里添加自己产品需要的文件进去。

通过简单grep可以找到主程序文件就是:product/hi3559/init_master/hi_product_init_main.c

未完待续…

建立Hi3559 开发环境须知

操作系统:CentOS7.4 minimal
SDK版本:Hi3559V100R003C02SPC009

建立开发环境步骤在此不表,文档《Hi3559V100/Hi3556V100 SDK安装使用说明.pdf》已经介绍很详细了,只是它针对的平台是ubuntu14.04 64bit server,不过我要把它安装到centos系统上,并且是最小系统,很多软件包都没有,当然基本的C/C++开发工具(gcc/g++/make/autoconf/gdb)还是有的。既然在最小系统上编译这么庞大的软件代码难免会遇到各种各样问题,这种心理准备我是有的,本着兵来将挡水来土掩的心态处之即可。这两天实际操作过程中果不其然遇到了动态库找不到情况,还好通过yum解决了,具体问题不表,现将解决方法介绍如下:
1、下载安装bc、ncurse开发包、glibc-static包:
yum install bc ncurses-devel glibc-static -y
2、替换默认的3.82版本make为3.81,由于yum无法降级make,只能下载源码编译然后替换/usr/bin/make。

这里要特别说明一下第二步操作原因,如果不做这个降级处理,在执行osdrv/tools/pc/mkimage_tool/fastboot下Makefile时报错:Makefile:517: *** mixed implicit and normal rules. Stop.具体代码片段:
platform.mk \
%: %_config
$(MAKE)

根据以往经验,这一定时make工具版本太新或太旧造成的,具体是哪个最近版本才支持就只能通过二分判断法来找寻答案了,结果升级到最新的4.2不行,试着降级到3.80也不行,最后降级到3.81才解析通过,看来海思编写编译脚本的高手对3.81版make规则运用很娴熟,问题是为什么这个规则的出现前无古人后无来者呢?

编译安卓版Hi3798M固件

1、准备工作参见《Android解决方案-开发指南.pdf》文档。
2、解压HiSTBAndroidV600R001C00SPC060压缩文件到一个文件夹,本文用android取名指代。
3、解压HiSTBAndroidV600R001C00SPC062压缩文件,并把解压后的文件拷贝覆盖到android下面,然后执行clean.sh脚本。
4、解压HiSTBAndroidV600R001C00SPC063压缩文件,并把解压后的文件拷贝覆盖到android下面,然后执行clean.sh脚本。
5、进入android文件夹,执行:
source build/envsetup.sh
lunch Hi3798MV100-eng
make bigfish 2>&1 | tee bigfish.log
进入漫长的编译过程。

编译过程会遇到如下三个问题:
1、内核刚开始编译时提示几个新配置选择后退出,解决办法是:将device/hisilicon/bigfish/sdk/source/kernel/linux-3.10.y/arch/arm/configs/hi3798mv100_android_defconfig中添加:
CONFIG_ARM_HAS_SG_CHAIN=y
# CONFIG_MTD_NAND_HIFMC100_NAND is not set
# CONFIG_MTD_SPINAND_HIFMC100 is not set
然后重新make

2、recovery内核岗开始编译时提示几个新配置选择后退出,解决办法是:将device/hisilicon/bigfish/sdk/source/kernel/linux-3.10.y/arch/arm/configs/hi3798mv100_android_recovery_defconfig拷贝到out/target/product/Hi3798MV100/obj/RECOVERY_OBJ/.config,即:
cp device/hisilicon/bigfish/sdk/source/kernel/linux-3.10.y/arch/arm/configs/hi3798mv100_android_recovery_defconfig out/target/product/Hi3798MV100/obj/RECOVERY_OBJ/.config
然后重新make

3、编译链接libwebviewchromium.so动态库时长时间停滞不动甚至退出编译,这是内存不够用的表现,解决办法是添加交换分区:
export SWAPFILE=/mnt/swapfile
dd if=/dev/zero of=$SWAPFILE bs=1024 count=4194304
mkswap $SWAPFILE
chmod 600 $SWAPFILE
swapon $SWAPFILE
立即生效,不用重新make