一、操作环境
PC:win10
虚拟机:Ubuntu14.04 LTS 64bit
板端:DOPI 3516EV200 (Hi3516EV200)NAND 128MB
需要liteOs SDK(Hi3516EV200_SDK_V5.0.1.1.tgz)、以及海思的开发文档。
二、在linux环境下解压sdk
tar -zxf Hi3516EV200_SDK_Vx.x.x.x.tgz
解压完毕后会有package 、scripts两个文件夹以及两个脚本:sdk.cleanup 、sdk.unpack。根据官方文档的指引《Hi3516EV200╱Hi3516EV300╱Hi3518EV300 Huawei LiteOS SDK 安装以及升级使用说明.pdf》路径:ReleaseDoc\zh\01.software\board,展开sdk:
source ./sdk.unpack
这里先确保下当前的权限为root,解压完成提示:
就如图所示会出现drv 、mpp 、osal 、osdrv是个目录,至此SDK基本上已经完成解压。
三、安装交叉编译器
先对交叉编译器进行解压, tar xzf arm-himix100-linux.tgz,运行 chmod +x arm-himix100-linux.install,然后运
行./arm-himix100-linux.install 即可,执行这些需要root用户权限执行,使用前需切换为root。安装好后在/opt下:
海思文档里面的安装交叉编译器是安装在/opt目录下,个人习惯喜欢放在sdk的目录下,然后再创建一个脚本,每次使用sdk前都需要source下这个脚本,以使得将交叉编译链的路径添加在系统的环境变量里面,我将交叉编译器安装之后提取出来,在刚刚解压的sdk目录下创建一个文件夹专门存放这个交叉编译器。在sdk目录下创建一个tools/toolchains的目录用于存放交叉编译链,将打包好的交叉编译链放在这个文件夹内:
四、创建一个添加环境变量的脚本
在Android或者Tina Linux的sdk中,每次使用sdk前首先要source ./build/envsetup.sh用户初始化sdk的环境变量 ,于是便产生了一个习惯,没事使用sdk先source脚本然后再进行后续的操作。脚本的任务很明确,就是要知道我的arm-himix100-linux-一系列编译器的路径添加到系统的PATH,我们先获得脚本的路径然后再用相对路径操作:
#!/bin/bash
WORKPATH=$(pwd)
TOPDIR=$WORKPATH
COMPILER_PREFIX=$TOPDIR/tools/toolchains
if [ ! -d $COMPILER_PREFIX/hisi-linux/x86-arm/arm-himix100-linux ]; then
echo "Failed to set arm-himix100-linux"
return
fi
TOOLCHAINS=$COMPILER_PREFIX/hisi-linux/x86-arm/arm-himix100-linux/bin
export PATH=$TOOLCHAINS:$PATH
echo "Set environment arm-himix100-linux successfully..."
于是在每次使用sdk时source ./build/envsetup.sh, 打印Set environment arm-himix100-linux successfully...说明执行的没问题。使用arm-himix100-linux-gcc -v便知道有没有成功添加至环境变量。
五、编译liteOs内核
Hi3516EV200可以选择从emmc启动也可以从spi设备启动(nor or nand),DOPI 3516EV200板载128MB Nand Flash,所以我们使用spi启动。
在sdk/osdrv下有两个说明文档readme_cn.txt,里面有说明怎么编译liteOs内核,文档的主要内容在:
(1)编译整个osdrv目录:
make all
注意:由于Makefile中文件系统编译依赖组件较多,不能保证单独编译的文件系统可用,建议采用make all编译;
但可单独编译uboot,liteos;
可以传如下参数:
a, BOOT_MEDIA:spi(default) or emmc
b, CHIP:hi3516ev200(default) or hi3516ev300 or hi3518ev300
c, 如果客户想要更换可以使用TARGET_XLSM=*.xlsm来指定所需要的u-boot表格文件
(2)清除整个osdrv目录的编译文件:
make clean
(3)彻底清除整个osdrv目录的编译文件,除清除编译文件外,还删除已编译好的镜像:
make distclean
(4)单独编译liteos (以hi3516ev200为例):
cd osdrv/platform/liteos
tar -xf liteos.tgz
cd liteos/
cp tools/build/config/hi3516ev200_defconfig .config
make menuconfig (如有需要,可根据需求进行功能配置)
make
(5)单独编译uboot:
注意:发布包默认按照DMEB板的配置发布,如果客户单板和DEMB板不一致,需要根据客户自己的单板环境修改uboot表格才能使用,否则可能导致uboot无法启动或者其他问题。
待进入boot源代码目录后,执行以下操作
make ARCH=arm CROSS_COMPILE=arm-himix100-linux- hi3516ev200_defconfig
(emmc启动时执行如下操作:make ARCH=arm CROSS_COMPILE=arm-himix100-linux- hi3516ev200_emmc_defconfig)
make ARCH=arm CROSS_COMPILE=arm-himix100-linux- -j 20
make -C ../../../tools/pc/hi_gzip
cp ../../../tools/pc/hi_gzip/bin/gzip arch/arm/cpu/armv7/hi3516ev200/hw_compressed/ -rf
Windowns下进入到osdrv/tools/pc/uboot_tools/目录下打开对应单板的Excel文件,在main标签中点击"Generate reg bin file"按钮,生成reg_info.bin即为对应平台的表格文件。
从osdrv/tools/pc/uboot_tools目录拷贝reg_info.bin到boot源代码目录,重命名为.reg
cp ../../../tools/pc/uboot_tools/reg_info.bin .reg
make ARCH=arm CROSS_COMPILE=arm-himix100-linux- u-boot-z.bin
opensource/uboot/u-boot-2016.11下生成的u-boot-hi3516ev200.bin即为可用的u-boot镜像
我们这个是空的sdk没有编译过,所以我们选择编译全部(uboot,liteos kernel),当然编译内核需要有仪式感,我们使用一个脚本放在sdk目录下,只要运行这个脚本便可以自动编译全部。脚本很简答就是去sdk/osdrv下敲个make all,然后再指定下BOOT_MEDIA以及CHIP便可,那就创建一个脚本为make_all_spi.sh:
cd osdrv
make all BOOT_MEDIA=spi CHIP=hi3516ev200
接着我们./make_all_spi.sh,于是一般就会出现以下错误:
原因是sh命令链接到的是dash,而pushd命令需要在bash的环境中执行,我们需要修改为bash,执行:
dpkg-reconfigure dash
弹出界面选择no,然后再回车,然后继续执行./make_all_spi.sh.接着不出意外,经过漫长的编译刷屏后编译完成了。生成的文件在sdk/osdrv/pub/liteos/sample.bin和sdk/osdrv/pub/boot/u-boot-hi3516ev200.bin,这个其实就是一个app加上liteos的内核,我们可以用这个测试,对应liteos的软件框架会在后续需的章节进行介绍,敬请关注。。。。。
六、编译文件系统
对于liteos版本的文件系统不像linux那样,只是通过第三方的工具来实现将某一个目录打包成一个文件系统。
对于Hi3516EV200启动的方式有spi与emmc,决定了他的文件系统格式一般是jffs2与ext4,所以我们需要第三
放的打包工具进行打包,相关工具在sdk/osdrv/readme_cn.txt有下载链接,我们是用的是spi nand,所以使用
的文件系统是jffs2,对于emmc的话需要make_ext4fs,需要的朋友可以在下评论留言,这里就不说明了。跳转到
sdk/osdrv/tools/pc/jffs2_tool,编译make,接着会有以下报错:
原因还是sdk/osdrv/tools/pc/zlib下没有库,我们进入zlib这个把目录下,有个文档,里面有个下载链接,将其下载后放在zlib目录下然后重新进入jffs2_tool下make,等待编译好,会出现两个工具:mkfs.jffs2和mkfs.ubifs用于制作两个不同类型的文件系统(jffs2与ubi),将mkfs.jffs2拷贝到sdk/osdrv/pub/tools/下,然后在pub下创建一个rootfs文件夹用于存放文件系统相关文件,在rootfs目录下创建两个文件夹bin与rootfs,前者用于存放mkfs.jffs2制作好了的文件镜像,后者用于mkfs.jffs2工具打包那个目录作为文件系统。接下来在sdk目录下出继续创建一个脚本,用于运行这个脚本就自动打包文件系统:
#!/bin/bash
./osdrv/pub/tools/mkfs.jffs2 -d osdrv/pub/rootfs/rootfs -l -e 0x10000 -o osdrv/pub/rootfs/bin/hi3516ev200_64k.jffs2
这个是mkfs.jffs2工具传参决定的,具体可以查看这个的用法;按照上述运行这个脚本会在sdk/osdrv/pub/rootfs/bin下生成
hi3516ev200_64k.jffs2这样的文件系统文件。以上创建的文件夹根据自己的情况而定,自己按照情况修改上述的脚本便可。
至此,uboot、kernel、rootfs已经编译完成,剩下烧录。
七、烧录
安装好HiTool后选择芯片选择Hi3516EV200,然后连接串口,配制表如下设置:
选择烧写便可以了,大小可以自己修改但是得跟uboot环境变量适配。
由于选用的串口烧录,时间有点漫长,烧录完毕后板子会进入到uboot状态,由于没有设置从哪里引导内核,所以会一直在终端界面,所以我们要设置下启动变量:
setenv bootcmd 'sf probe 0;sf read 0x40000000 0x100000 0xa00000; go 0x40000000'
saveenv
setenv bootcmd 'nand read 0x40000000 0x100000 0xa00000; go 0x40000000'
saveenv
上面的那条是nor启动,下面的是nand启动。sf probe 0用于探测以及初始化nor flash,然后从0x100000处读取0xa00000长度,到内存的0x40000000,意思就是读取kernel(sample.bin),读取10M到内存的0x40000000位置,然后转过去。我们在uboot设置这个环境变量后便可以直接进入sample.bin,如图:
System startup
Uncompress Ok!
U-Boot 2016.11 (Jun 12 2020 - 22:49:09 +0800)hi3516ev200
Relocation Offset is: 03734000
Relocating to 43f34000, new gd at 43e93ef0, sp at 43e93ed0
SPI Nor: Boot Media isn't SPI Nor
NAND: hifmc_ip_ver_check(44): Check Flash Memory Controller v100 ...hifmc_ip_ver_check(50): Found
SPI Nand ID Table Version 2.7
SPI Nand(cs 0) ID: 0xef 0xaa 0x21 Name:"W25N01GV"
Block:128KB Page:2KB OOB:64B ECC:4bit/512
Chipsize:128 MiB
MMC:
In: serial
Out: serial
Err: serial
Net: eth0
Warning: eth0 (eth0) using random MAC address - be:fa:16:59:44:05
Hit any key to stop autoboot: 0
NAND read: device 0 offset 0x100000, size 0xa00000
10485760 bytes read: OK
## Starting application at 0x40000000 ...
********Hello Huawei LiteOS********
version : Huawei LiteOS V200R002C00SPC050B012
open-version : Huawei LiteOS 3.2.3
build data : Jun 12 2020 22:51:32
Huawei LiteOS #
************************************************************
random dev init ...
************************************************************
MMC dev init ...sd_mci_probe:1851: host1: detection is broken
************************************************************
mem dev init ...
************************************************************
porc fs init ...
Mount procfs finished.
************************************************************
spi bus init ...
************************************************************
i2c bus init ...
************************************************************
gpio init ...
************************************************************
nand init ...
Nand ID:0xEF 0xAA 0x21
Nand:"W25N01GV"
Size:128MB Block:128KB Page:2KB Oob:64B Ecc:8bit/1K
yaffs: 0 blocks to be sorted...
************************************************************
spi nor flash init ...
hifmc100_host_init(538): Warning:Flash type isn't Spi Nor!
spinor_host_init(613): Error:hifmc100 host init fail!
hifmc100_probe(125): Error:spinor host init fail!
[ERR] probing device hifmc100 with driver hifmc100 failed
[ERR] driver attach failed
************************************************************
net init ...
VPP2.0 V100R001C20 (lwIP) Jun 12 2020 22:51:01
Ethernet start.hisi_eth: User did not set phy mode, use default=mii
hisi_eth: User did not set phy addr, auto scan...
FEPHY: addr=0 ld_am=0xb, ldo_am=0x4, r_tuning=0x1d DONE.
Detected phy addr 0, phyid: 0x20669903
Huawei LiteOS #
Huawei LiteOS #
Huawei LiteOS #
Huawei LiteOS #
至此,已经完成了启动,至于文件系统在哪呢,后续章节会分析!有问题请留言。
八、友情链接
DOPI官方群:735884031
购买链接:https://item.taobao.com/item.htm?spm=a230r.1.14.1.71ee4becDs9H02&id=618882047300&ns=1&abbucket=0#detail