一、根文件系统理论
关于根文件系统的原理,可以参看以下博客。
根文件系统的原理
使用BusyBox制作根文件系统的理论分析
二、海思的根文件系统
1、海思的根文件系统体现在Hi3518E_SDK_V1.0.3.0\package\rootfs_uclibc目录。
而根文件系统大部分工作由etc/init.d/rcS完成。
2、init.d目录下的内容。
(1)rcS文件遍历打印的内容可以由uboot界面输出得到验证。
(2)查看每个Sxx…文件可以得知一些信息。也可以根据需要修改这些文件的内容,前提是得懂设置的意思。
三、为海思根文件系统部署mpp
mpp是海思编写的与视频编解码有关的驱动ko、库lib等内容。因为海思SDK提供的根文件系统没有部署mpp,因此不能直接执行sample程序(前面初体验中的例子也不能运行,因为它依靠mpp,但发货时开发板已经部署好mpp,所以可以直接运行)。
我们需要部署这些内容,也就是把这些内容放在合适的目录位置,然后制作完整的根文件系统并制作成镜像烧录至板子。
1、mpp的目录结构
mpp目录位于Hi3518E_SDK_V1.0.3.0\package\mpp,其文件组织如下。
2、完整版(即包含mpp)根文件系统的制作步骤
(1)在osdev/pub/目录下找到rootfs_uclibc.tgz(也可以使用Hi3518E_SDK_V1.0.3.0/package目录系的),解压后得到文件夹形式的根文件系统osdrv/pub/rootfs_uclibc/。
(2)将Hi3518E_SDK_V1.0.3.0\package\mpp目录下的ko文件夹复制到osdrv/pub/rootfs_uclibc/目录下,将lib文件夹里的内容复制到osdrv/pub/rootfs_uclibc/usr/lib中。lib文件夹中有a静态库和.so动态库,这里主要是动态库的部署,所以可以把.a文件删掉。
root@ubuntu:/home/xjh/iot/hisi_development/Hi3518E_SDK/Hi3518E_SDK_V1.0.3.0/osdrv/pub# ls
bin image_uclibc rootfs_uclibc rootfs_uclibc.tgz
root@ubuntu:/home/xjh/iot/hisi_development/Hi3518E_SDK/Hi3518E_SDK_V1.0.3.0/osdrv/pub# cd rootfs_uclibc
root@ubuntu:/home/xjh/iot/hisi_development/Hi3518E_SDK/Hi3518E_SDK_V1.0.3.0/osdrv/pub/rootfs_uclibc# ls
bin boot dev etc home init lib linuxrc lost+found mkimg.rootfs mknod_console mnt nfsroot opt proc root sbin share sys tmp usr var
root@ubuntu:/home/xjh/iot/hisi_development/Hi3518E_SDK/Hi3518E_SDK_V1.0.3.0/osdrv/pub/rootfs_uclibc# cp ../../../mpp/ko/ ./ -rf
root@ubuntu:/home/xjh/iot/hisi_development/Hi3518E_SDK/Hi3518E_SDK_V1.0.3.0/osdrv/pub/rootfs_uclibc# ls
bin boot dev etc home init ko lib linuxrc lost+found mkimg.rootfs mknod_console mnt nfsroot opt proc root sbin share sys tmp usr var
root@ubuntu:/home/xjh/iot/hisi_development/Hi3518E_SDK/Hi3518E_SDK_V1.0.3.0/osdrv/pub/rootfs_uclibc# cd lib/
root@ubuntu:/home/xjh/iot/hisi_development/Hi3518E_SDK/Hi3518E_SDK_V1.0.3.0/osdrv/pub/rootfs_uclibc/lib# ls
ld-uClibc-0.9.33.2.so libc.so.0 libgcc_s.so.1 libnsl-0.9.33.2.so libresolv-0.9.33.2.so libstdc++.so libthread_db.so.1
ld-uClibc.so.0 libdl-0.9.33.2.so libhimount_api.a libnsl.so.0 libresolv.so.0 libstdc++.so.6 libuClibc-0.9.33.2.so
libcrypt-0.9.33.2.so libdl.so.0 libm-0.9.33.2.so libpthread-0.9.33.2.so librt-0.9.33.2.so libstdc++.so.6.0.19 libutil-0.9.33.2.so
libcrypt.so.0 libgcc_s.so libm.so.0 libpthread.so.0 librt.so.0 libthread_db-0.9.33.2.so libutil.so.0
root@ubuntu:/home/xjh/iot/hisi_development/Hi3518E_SDK/Hi3518E_SDK_V1.0.3.0/osdrv/pub/rootfs_uclibc/lib# cp ../../../../mpp/lib/* ./
root@ubuntu:/home/xjh/iot/hisi_development/Hi3518E_SDK/Hi3518E_SDK_V1.0.3.0/osdrv/pub/rootfs_uclibc/lib#
(3)在osdrv/pub/rootfs_uclibc/etc/profile文件中添加“设置板载系统网卡的ip址”的指令。
ifconfig lo 127.0.0.1
ifconfig eth0 192.168.1.11
(4)在osdrv/pub/rootfs_uclibc/etc/profile文件中添加“自动挂载NFS服务器”的指令。
mount -t nfs -o nolock 192.168.1.141:/home/xjh/iot/hisi_development/hisi_rootfs /mnt
(5)在osdrv/pub/rootfs_uclibc/etc/profile文件中继续添加如下指令(其中第一条指令只是为了挂载SD卡而已,可无,见下面完整的profile文件内容中的描述。)
mount -t vfat /dev/mmcblk0p1 /usr/mmc
cd /ko
./load3518e -i -sensor ar0130 -osmem 32 -total 64
完整的/etc/profile文件内容如下。
# /etc/profile: system-wide .profile file for the Bourne shells
#
#
set_path_before()
{[ -d $1 ] && PATH="$1:$PATH"
}PATH="/usr/bin:/usr/sbin:/bin:/sbin"
set_path_before /usr/local/sbin
set_path_before /usr/local/bin
#若自己设置了其他路径,需要导出,即使用export LD_LIBRARY_PATH=xxxx:$LD_LIBRARY_PATH
LD_LIBRARY_PATH="/usr/local/lib:/usr/lib"export PATH
export LD_LIBRARY_PATH# ANSI COLORS
CRE="^M^[[K"
NORMAL="^[[0;39m"
RED="^[[1;31m"
GREEN="^[[1;32m"
YELLOW="^[[1;33m"
BLUE="^[[1;34m"
MAGENTA="^[[1;35m"
CYAN="^[[1;36m"
WHITE="^[[1;37m" umask 022 echo "${GREEN}Welcome to HiLinux.${NORMAL}" ifconfig lo 127.0.0.1
ifconfig eth0 192.168.1.11#/usr/mmc是我自己创建的,一开始没有这个目录(所以第一次执行此命令的话会报错,要创建此目录后才能使用下面的那条mount命令)。
#/dev/mmcblk0p1是插卡后显示的。
#整句命令意思是将SD卡挂载到/usr/mmc目录下。
#mount -t vfat /dev/mmcblk0p1 /usr/mmc cd /ko
./load3518e -i -sensor ar0130 -osmem 32 -total 64mount -t nfs -o nolock 192.168.1.141:/home/xjh/iot/hisi_development/hisi_rootfs /mntcd /mnt
(6)输入以下命令手工制作根文件系统镜像文件。注意路径。
osdrv/pub/bin/pc/mkfs.jffs2 -d osdrv/pub/rootfs_uclibc -l -e 0x10000 -o osdrv/pub/rootfs_uclibc_64k.jffs2
(7)烧录至spiflash。烧录方法见博客(注意实际的镜像文件名字!):海思方案中uboot、kernel和rootfs的烧写方法
(8)镜像测试。uboot启动后,首先要测试是否能ping通虚拟机;然后板载系统启动后,看挂载是否成功;然后看/etc/profile里设置的内容是否得到执行。