hi3516 intro
1.本人拿到的 HI3516CV500DMEB VER.A 单板,只有 uboot 2016.11.
2.该板子所拥有的硬件资源如下:
->1.SPI nor flash ,16MB, 64KB(blocksize) ,nor flash型号为:n25q128a13
hisi-sfc hisi_spi_nor.0: n25q128a13 (Chipsize 16 Mbytes, Blocksize 64KiB)
->2.DDE 好像也是16M.
hisilicon # `bdinfo`
arch_number = 0x00001F40
boot_params = 0x82000100
DRAM bank = 0x00000000
-> start = 0x80000000
-> size = 0x10000000
->3.没有nand,emmc 等其他存储设备。
3.该板子其他的软件打印信息:
->1.hisilicon # base
Base Address: 0x00000000
hisilicon # bdinfo
arch_number = 0x00001F40
boot_params = 0x82000100
DRAM bank = 0x00000000
-> start = 0x80000000
-> size = 0x10000000
eth0name = eth0
ethaddr = aa:aa:aa:aa:aa:aa
current eth = eth0
ip_addr = 192.168.1.10
baudrate = 115200 bps
TLB addr = 0x8FFF0000
relocaddr = 0x8FF30000
reloc off = 0x0D730000
irq_sp = 0x8FE8FEE0
sp start = 0x8FE8FED0
Early malloc usage: 70 / 2000
->2.hisilicon # getinfo bootmode
spi
hisilicon # getinfo nand
no find nand //表明没有nand .
hisilicon # getinfo spi //spi nor flash 16M
Block:64KB Chip:16MB*1
ID:0x20 0xBA 0x18
Name:"N25QL128A"
hisilicon # getinfo version
version: U-Boot 2016.11
->3.hisilicon # version
U-Boot 2016.11 (Aug 31 2018 - 17:14:28 +0800)hi3516cv500
arm-himix200-linux-gcc (HC&C V100R002C00B020_20180814) 6.3.0
GNU ld (GNU Binutils) 2.29
->4.hisilicon # print
arch=arm
baudrate=115200
board=hi3516cv500
board_name=hi3516cv500
bootargs=mem=128M console=ttyAMA0,115200 root=/dev/mtdblock2 rootfstype=jffs2 rw mtdparts=hi_sfc:1M(boot),4M(kernel),11M(rootfs)
bootcmd=sf probe 0;sf read 0x82000000 0x100000 0x400000;bootm 0x82000000
bootdelay=2
cpu=armv7
ethact=eth0
ethaddr=aa:aa:aa:aa:aa:aa
gatewayip=192.168.1.1
ipaddr=192.168.1.10
netmask=255.255.255.0
serverip=192.168.1.141
soc=hi3516cv500
stderr=serial
stdin=serial
stdout=serial
vendor=hisilicon
verify=n
Environment size: 539/262140 bytes
4.uboot的启动打印信息如下:
System startup
U-Boot 2016.11 (Aug 31 2018 - 17:14:28 +0800)hi3516cv500
DRAM: 256 MiB
Relocation Offset is: 0d730000
Relocating to 8ff30000, new gd at 8fe8fef0, sp at 8fe8fed0
SPI Nor: Check Flash Memory Controller v100 ... Found
SPI Nor ID Table Version 1.0
SPI Nor(cs 0) ID: 0x20 0xba 0x18
Block:64KB Chip:16MB Name:"N25QL128A"
SPI Nor total size: 16MB
NAND: 0 MiB
In: serial
Out: serial
Err: serial
Net: eth0
Hit any key to stop autoboot: 0
5.hi3516烧写内核和跟文件系统的命令如下:
(可参考:Hi3516CV500╱Hi3516DV300 SDK 安装及升级使用说明.pdf)
(但要注意:参考文件是以nand为存储器来举例的,但我们的板子是spi nor flash.所以烧写命令可能不同)
->烧写内核:(/Hi3516CV500_SDK_V2.0.0.1/osdrv/pub/hi3516cv500_spi_smp_image_glibc/uImage_hi3516cv500_smp)
1.mw.b 82000000 ff 400000
2.tftp 82000000 uImage_hi3516cv500_smp
3.sf probe
4.sf erase 100000 400000
5.sf write 82000000 100000 400000
->烧写跟文件系统:(/Hi3516CV500_SDK_V2.0.0.1/osdrv/pub/rootfs_glibc.tgz)
1.mw.b 82000000 ff 800000 (注意:最后的这个数字范围可以是500000~800000,原因:
跟文件系统为4.1M,所以最小500000,800000是因为实际测试,最大就是这个值)
2.tftp 82000000 rootfs_hi3516cv500_64k.jffs2
(注意:选jffs2,是因为bootargs已经规定了;选择64K,这是因为spi nor flash的block块大小是64KB).
3.sf probe
4.sf erase 500000 B00000
(注意:最后一个数字,是可以变得,我估计只要大于4.1M就行。但这个B00000我实际是可用的,其他没试过。)
5.sf write 82000000 500000 B00000
(注意:最后一个数字,是可以变得,我估计只要大于4.1M就行。但这个B00000我实际是可用的,其他没试过。)
(以上命令中我们使用的是 sf 命令。但参考中使用的是nand 命令。那是因为存储器不同造成的。)
nfs 挂载 rootfs_glibc:
先解压 /Hi3516CV500_SDK_V2.0.0.1/osdrv/pub/rootfs_glibc.tgz
然后用 nfs 挂载 rootfs_glibc 目录
把 /Hi3516CV500_SDK_V2.0.0.1/smp/a7_linux/mpp 目录中的 ko 和 lib 拷到
/home/nsc/workspace/rootfs_glibc/ko
/home/nsc/workspace/rootfs_glibc/usr/lib
一定要把这个文件的执行权限改了,否则会出现驱动加载失败,
导致用例程序调用 HI_MPI_SYS_Exit API时 open err 错误!
$cd /home/nsc/workspace/rootfs_glibc/ko
$ sudo chmod 777 load3516cv500
$ sudo gedit /home/nsc/workspace/rootfs_glibc/etc/profile
在最后加入如下内容:
cd /ko
./load3516cv500 -i -sensor0 imx327
cd -
6.板子烧写地址空间说明:
| 1M | 4M | 11M | (spi nor flash 总共16M)
| boot | kernel | rootfs |
7.因为spi nor flash 只有16M,不够mpp的相关文件存放,所以在开发阶段,
使用nfs 远程挂在根文件系统。等到开发完毕,我只使用nfs方式挂在mpp相关文件。
8.nfs 远程挂在文件夹形式的根文件系统:
原bootargs为:(这是告诉内核如何从硬件设备中启动rootfs;或者怎么启动rootfs)
bootargs=mem=128M console=ttyAMA0,115200 root=/dev/mtdblock2 rootfstype=jffs2 rw mtdparts=hi_sfc:1M(boot),4M(kernel),11M(rootfs)
原bootcmd为: (这是告诉uboot 怎么启动内核,从哪里/设备 中读取内核源码,进行启动)
bootcmd=sf probe 0;sf read 0x82000000 0x100000 0x400000;bootm 0x82000000
因为我们只远程挂在根文件系统,所以,我们只需要修改bootargs 就可以。
修改后的bootargs为:(一下是设置命令)
setenv bootargs root=/dev/nfs rw nfsroot=192.168.1.141:/work/rootfs_hi/rootfs_glibc ip=192.168.1.10:192.168.1.141:192.168.1.1:255.255.255.0::eth0:off init=/linuxrc console=ttyAMA0,115200 mem=64M
注意:
- bootargs 一定要加上mem=64M。否则内核起不起来。(我猜想海思因为内存要做两用,所以他在内核启动前会校验是否设置的系统的内存分配。否则不启动)
- 因为内核启动需要知道内存是怎么被分配的,就是 系统运行需要多少,mpp视频处理需要多少。这里mem=64M,指的是系统运行需要多少。设置一个就行。因为这里是rootfs启动需要的,所以不需要设置mpp需要的内存。
为什么这里是64M,这是因为,这里要和mpp/ko/load3516cv500 文件中的os_mem_size的值一样,或者说只要这两个值一样就行,但因为load3516cv500中设置成了64M,我们懒的该,所以也使用64M.
(而且这是海思分配的,人家考虑的是比较全面的。所以我们按照人家的来就行。)
#DDR start:0x80000000, kernel start:0x80000000, OS(64M); MMZ start:0x84000000
mem_total=256 # 256M, total mem
mem_start=0x80000000 # phy mem start
os_mem_size=64 # 64M, os mem
mmz_start=0x84000000; # mmz start addr
mmz_size=192M; # 192M, mmz size->将mpp/ko 目录拷贝到 rootfs 的根目录下(也就是/ko).
->将mpp/lib/* 目录下的.so动态库文件拷贝到 rootfsd的/usr/lib/目录下,这样系统会首先自动在这个文件里搜素到他需要的动态库。(当然我们也可以将lib存放的目录设置为系统自动搜素目录)。
A. 在rootfs 中的 /etc/profile(这是系统执行登录的操作文件) 的文件末尾加上:
->1.vi /etc/profile 添加内容如下:
cd /ko (我们将ko目录放到根目录下)
./load3516cv500 -i -sensor0 imx327
cd -
->2.修改 /ko/load3516cv500文件的文件权限,增加可执行权限:
chmod 777 load3516cv500
B. reboot 或者重新上电重启,就ok.
C.制作新的jffs2文件系统:
sudo osdrv/pub/bin/pc/mkfs.jffs2 -d osdrv/pub/rootfs_glibc -l -e 0x10000 -o osdrv/pub/rootfs_glibc_64k.jffs2
疑问: -l 什么意思?? -e 0x10000 什么意思??
-l, --little-endian 指定使用小端格式
-e, --eraseblock=SIZE 设定擦除块的大小为(默认: 64KiB = 0x10000) 这里的值需要和Flash器件保持一致,在uboot启动时log信息里面有
D.直接在sample 的某个目录下 make,比如 :venc ,直接在它下面make ,就可以得到 一个可以执行程序,拿到 板子中直接运行就行。
E.vi /etc/profile 末尾添加:
sleep 1
mount -t nfs -o nolock -o tcp -o rsize=32768,wsize=32768 192.168.1.141:/work/rootfs_hi /mnt
cd /root
./loadmpp.sh
cd -
vi loadmpp.sh
#!/bin/sh
cd /mnt/mpp/ko
./load3516cv500 -i -sensor0 imx327 (这个可能有变,尝试之后,不行在换另一个。)
cd -
F.因为spi nor flash 供 16M,而且没有其他的存储设备,所以接下来的MPP 和 lib部署,我选择 nfs 远程挂载的方式。
mount -t nfs -o nolock -o tcp -o rsize=32768,wsize=32768 192.168.1.141:/work/rootfs_hi /mnt
这是hi3519的。
cd /root
./nfsroot
echo "------nfsroot is over------"
cd /root/ko
./load3519v101 -a -sensor0 imx274 -osmem 64
echo "------ko is over---------"
cd /root
telnetd&
~onfig eth0 192.168.1.40
#mount -t nfs -o nolock -o tcp -o rsize=32768,wsize=32768 192.168.1.59:/export/nfsroot /mnt
mount -t nfs -o nolock -o tcp -o rsize=32768,wsize=32768 192.168.1.141:/work/rootfs /mnt
telnetd&
~
setenv bootargs root=/dev/nfs rw nfsroot=192.168.1.141:/work/rootfs_hi/rootfs_glibc ip=192.168.1.10:192.168.1.141:192.168.1.1:255.255.255.0::eth0:off init=/linuxrc console=ttyAMA0,115200 mem=128M
bootargs=mem=128M console=ttyAMA0,115200 root=/dev/mtdblock2 rootfstype=jffs2 rw mtdparts=hi_sfc:1M(boot),4M(kernel),11M(rootfs)
bootcmd=sf probe 0;sf read 0x82000000 0x100000 0x400000;bootm 0x82000000
osdrv/pub/bin/pc/mkfs.jffs2 -d 根文件系统路径 -l -e 0x10000 -o xxx/xx/rootfs_uclibc_64k.jffs2
F.在 Ubuntu 下用 tar -zxf 解压:
Hi3516CV500R001C02SPC001/01.software/board/Hi3516CV500_SDK_V2.0.0.1.tgz
arm-himix200-linux.tgz
进入 Hi3516CV500_SDK_V2.0.0.1 目录
切换成 root 用户,执行解包脚本
$sudo su
#source sdk.unpack
进入 osdrv 目录,按 readme_cn.txt 来
1)下载 linux-4.9.37.tar.gz 并拷贝到 osdrv/opensource/kernel 目录中
2)修改 Makefile 文件并执行 make all
CHIP?=hi3516cv500
进入 arm-himix200-linux 目录
$chmod +x arm-himix200-linux.install
#sudo ./arm-himix200-linux.install
注:
1)出错:/bin/sh: 1: pushd: not found
$ sudo dpkg-reconfigure dash
选择No
2)出错:zlib.h 没有此文件或目录
$ sudo apt install zlib1g-dev
3)出错:"mkimage" command not found - U-Boot images will not be built
在 /etc/bash.bashrc 中添加export PATH=/home/nsc/workspace/Hi3516CV500_SDK_V2.0.0.1/osdrv/opensource/uboot/u-boot-2016.11/tools:$PATH